我是C的新手,我正努力在这个代码的和平中锻炼两件事;
提前致谢!
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);
}
答案 0 :(得分:8)
表达式:(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,等等)< / p>
顺便说一下,名称__u8
和__u16
是为实现保留的,所以除非这些名称实际由实现提供,否则您有未定义的行为(即,您不允许定义你的代码中的那些名字。)
答案 1 :(得分:5)
左边是bitwise AND变量(bmp[i]
),常量表示为hexadecimal