C : confusion over a small piece of code - what is '&0x' ?

标签 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);
}

最佳答案

表达式:(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/

相关文章:

c# - 温控功能/算法

ruby - @users 变量为空。忘记为 will_paginate 传递集合对象?

python - 将十六进制 MAC 地址转换为用户可读格式 (Python)

java - 需要一些关于十六进制到十进制算法如何工作的解释

c - C 编程中是否没有 case 语句,而不是 switch case 顺便说一句

c - lwip 板无法维持与另一个 lwip 板的连接

找不到/lib64/ld-linux-x86-64.so.2

PHP & MYSQL 从数据库中拉取行,将每个单元格设置为变量

java - 如何声明包含实现接口(interface)的类的子类的变量?

vim - diff - 在十六进制转储中查找两个值之间的特定变化