我试图了解以下C函数的作用是什么?
void foo(char v[4]) {
int* p = (int*)v;
*p = (*p & 0x000000FF) << 24 |
(*p & 0x0000FF00) << 8 |
(*p & 0x00FF0000) >> 8 |
(*p & 0xFF000000) >> 24;
}
假设sizeof(int)
为4,可能的解决方案是四个。
v
&lt; -The function v
答案 0 :(得分:1)
通过执行int* p = (int*)v;
,您现在可以访问v
中的位,就像它们一样
整数的位。但在这种情况下,它用于访问32位
无需在所有掉期中从char
转换为int
到char
。
(*p & 0x000000FF)
返回前8位(最低有效位)[0 - 7]
(*p & 0x0000FF00)
返回接下来的8位[8 - 15]
(*p & 0x00FF0000)
返回接下来的8位[16 - 23]
(*p & 0xFF000000)
返回最后8位(最重要的)[24 - 31]
基本上这样做:v[0]
,[v1]
等
<< x
位左移,<< 24
表示它移动所有位24
左边的空格。 |
进行按位OR运算
(*p & 0x000000FF) << 24
将位[0-7]移动到[24 - 31]位置
(*p & 0x0000FF00) << 8
将位[8-15]移动到[16 - 23]位置
(*p & 0x00FF0000) >> 8
将位[16 - 23]移动到[8 - 15]位置
(*p & 0xFF000000) >> 24;
将[23 - 31]移动到[0 - 7]位置。
它正在反转v
指向的字节顺序。
修改强>
正如其他人已经指出的那样,这种逆转只会起作用
char[4]
的大小与int
的大小相同的环境。
在那些不同的地方,代码变得不正确。
答案 1 :(得分:0)
它将char [4]解释为整数并将其交换:
(*p & 0x000000FF) << 24 == masks the lowes byte and puts it as highest byte
(*p & 0x0000FF00) << 8 == mask the 2nd lowest byte and puts it one higher
(*p & 0x00FF0000) >> 8 == masks the 2nd highest byte and shifts it one down
(*p & 0xFF000000) >> 24 == masks the highes byte and moves it to the lowest
all or-ed together it swaps your char array around.
从['a','b','c','d']
到['d','c','b','a'].
它闻起来。不好。
使用char
作为临时使用临时更换文件的元素&#34; 这是什么&#34;然后这个char-array到int指针的bithift转换更加节省 - 如果你在一个char为8位且int为64的系统上会发生什么?