【问题标题】:Strange behaviour with right bit shift右位移位的奇怪行为
【发布时间】:2014-01-21 22:53:11
【问题描述】:

谁能解释一下为什么下面的代码:

#include <iostream>
#include <bitset>

int main()
{
    unsigned char i = 2;
    std::cout<<std::bitset<8>((~static_cast<unsigned char>(0)) << i)<<std::endl;
    std::cout<<std::bitset<8>((~static_cast<unsigned char>(0)) >> i)<<std::endl;
    return 0;
}

生产:

11111100
11111111

而不是:

11111100
00111111

【问题讨论】:

  • 不要使用按位补码设置所有位,而是使用static_cast&lt;unsigned char&gt;(-1),您会得到预期的结果

标签: c++ bit-manipulation bit-shift


【解决方案1】:

~ 完成之前static_cast&lt;unsigned char&gt;(0) 被转换为int(发生整数提升),所以在~ 之后它变成了全一位int。然后将其移位并截断为 bitset 中的 8 位。

【讨论】:

  • 这很令人困惑,因为您明确要求unsigned char;但这就是标准所说的。
  • 如果你投到unsigned int而不是unsigned char,那么促销就不会发生。
【解决方案2】:

在右移时,如果最高有效位为 0,则有符号值填零,如果最高有效位为 1,则用一填充。

使用无符号值会强制在右移时填充零。

【讨论】:

  • 仔细看问题,他们试图使用无符号值。
猜你喜欢
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2011-11-05
  • 1970-01-01
  • 2023-03-09
  • 2021-10-28
相关资源
最近更新 更多