我是新手,所以我首先要说的是,当我查看一些代码时,我意识到这个功能对我来说没有任何意义。
正如您所看到的,此特定函数使用按位运算符将4个无符号char元素转换为整数。
//使用little-endian格式
将四字符数组转换为整数int toInt(const char* bytes) {
return (int)(((unsigned char)bytes[3] << 24) |
((unsigned char)bytes[2] << 16) |
((unsigned char)bytes[1] << 8) |
(unsigned char)bytes[0]);
}
short toShort(const char* bytes) {
return (short)(((unsigned char)bytes[1] << 8) |
(unsigned char)bytes[0]);
}
我已经知道按位运算符和char如何使用1个字节,int使用4个字节。为什么将char位向左移动24位而不是将其显式转换为int将其转换为int? 为什么这个函数需要按位运算符?
这个功能超出了我的理解范围,请解释这段代码以及它是如何工作的,或者至少给我一个能够彻底解释这个问题的链接。
我到处寻找解释,却找不到。
这可能有一个简单的解释。
答案 0 :(得分:6)
为什么这个函数需要按位运算符?
按位运算符用于从四个单字节数“汇编”四字节数。
假设您有四个8位数字,如下所示:
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
转移给你这个:
aaaaaaaa000000000000000000000000
00000000bbbbbbbb0000000000000000
0000000000000000cccccccc00000000
000000000000000000000000dddddddd
按位运算符OR
允许您从这四个部分中生成一个数字,因为OR
- 任意位x
为零会产生x
。如果对齐如上所示的四字节数字,则每个位置只有一个非零位,因此按位OR
会产生所需的结果:
aaaaaaaabbbbbbbbccccccccdddddddd