我正在尝试按如下方式设置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
我做错了什么?
由于
答案 0 :(得分:1)
最后的转变太多了。它将84乘以2得到168
答案 1 :(得分:1)
在系列结束时,您经常会为零移动一次:
//1
num |=1;
num <<=1;
//0
num <<= 1;
//0
num <<=1;
这不会生成二进制文件100
,而是1000
,因此您的结束值将是
1010 1000 (168)
而不是
1010 100 (84)
删除其中一个最后0班,你会很高兴: Example
答案 2 :(得分:1)
当你想&#34;追加&#34;一个1
,你应该先转移,然后或1
。否则,您将刚刚附加的1
移至2
,因此您的结果恰好是预期数字的两倍。
//1
num <<= 1;
num |= 1;
//0
num <<= 1;
然后,你的最后一次转移是正确的(与其他答案相反,这也是正确的,但如果你只是删除了最后一个班次你的代码注释是错误的。)