C:对一小段代码的混淆 - 什么是'& 0x'?

时间:2013-01-11 15:49:39

标签: c variables hex

我是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);
}

2 个答案:

答案 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