设置uchar的位

setting bits of a uchar

本文关键字:的位 uchar 设置      更新时间:2023-10-16

我正试图按如下方式设置uchar

uchar num = 0;
    //0
    num <<= 1;
    //1
    num |=1;
    num <<=1;
    //0
    num <<=1;
    //1
    num |=1;
    num <<=1;
    //0
    num <<=1;
    //1
    num |=1;
    num <<=1;
    //0
    num <<= 1;
    //0
    num <<=1;
    //should be 01010100 = 84
    std::cout << " num is " << num << " int " << (unsigned int) num << std::endl;

它应该以二进制8位序列01010100结束,该序列在十进制中为84。然而,当我打印时,我得到的输出是num is ® int 168

我做错了什么?

感谢

最后一个班次太多了。它将84乘以2,得到168

在您的系列结束时,您经常切换为零:

//1
num |=1;
num <<=1;
//0
num <<= 1;
//0
num <<=1;

这不会生成二进制100,而是生成1000,因此您的最终值将是

1010 1000 (168)

而不是

1010 100 (84)

删除最后0个移位中的一个,就可以继续了:示例

当您想要"追加"1时,您应该首先移位,然后对1进行OR运算。否则,您将刚刚附加的1移位,它将变为2,因此您的结果正好是预期数字的两倍。

//1
num <<= 1;
num |= 1;
//0
num <<= 1;

然后,您的最后一次移位是正确的(与其他答案相反,这些答案也是正确的,但如果您只是删除最后一次移动,则代码注释是错误的)。