我是 C 语言的新手,我正尝试在这段安静的代码中练习两件事;
- 下面 &0xfe 和 &0x01 的用途是什么?
- __u16 显然这是一个变量,但它们是什么类型,它们叫什么?
提前致谢!
static __u16 smile_bmp[] = {0x3C, 0x42, 0x95, 0xA1, 0xA1, 0x95, 0x42, 0x3C};
displayImage(smile_bmp,res, daddress, file);
int displayImage(__u16 bmp[], int res, int daddress, int file)
{
int i;
for(i=0; i<8; i++)
{
block[i] = (bmp[i]&0xfe) >>1 | (bmp[i]&0x01) << 7;
}
res = i2c_smbus_write_i2c_block_data(file, daddress, 16,
(__u8 *)block);
sleep(1);
}
最佳答案
表达式:(bmp[i]&0xfe) >>1 | (bmp[i]&0x01) << 7
作为一个整体,实际上是 bmp[i]
的 8 个最低有效位的旋转(又名循环移位) .
bmp[i] & 0xfe
部分取 bmp[i]
中的数字并屏蔽掉较低的位( 0xfe
表示“十六进制的 FE”,转换为二进制的 11111110
),所以当您 and
两者一起,它将最低位设置为 0 而不更改任何其他位(好吧,8 个最低位中的任何其他位 - 假设 bmp[i]
属于 __u16
类型,它显然有 16 位,所以掩码中的高 8 位也是零,因此它们在结果中也被设置为零)。
同样,bmp[i] & 0x01
部分是屏蔽所有 但 最低位。 0x01 是 00000001,所以当你 and
这个值与其他任何值,你保留最低有效位的原始值,并将所有其他位设置为 0。
然后将第一个向右移动一位,第二个向左移动 7 位,然后使用按位 or
将两部分重新组合在一起。最终结果是,从第 0 位开始的现在是第 7 位,所有其他的都向右移动了一个位置(之前的第 7 位现在是第 6 位,之前的第 6 位现在是第 5 位,等等)
顺便说一句,名字__u8
和 __u16
为实现保留,因此除非实现实际提供了这些名称,否则您有未定义的行为(即,您不允许在代码中定义这些名称)。
关于C : confusion over a small piece of code - what is '&0x' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14281702/