【问题标题】:How to bitshift integer value in c++如何在 C++ 中对整数值进行移位
【发布时间】:2013-10-15 22:57:57
【问题描述】:

我知道这是一个常见问题,但我无法弄清楚为什么我遇到了这么多麻烦。我正在尝试将一行从 IDL 代码转换为 c++

IDL:

for i = 0,7 do begin

    b = ishfy(b,1)
    print,b

endfor

我的 C++ 代码:

    for(int i = 0; i < 7; i++)
    {
        b = b << 1;
        cout << b;
    }

我最初的 b 是 255,我希望收到 254、252 等。相反,我的第一个位移返回 510。我假设我的问题是在位移之前没有将 b 转换为二进制形式。它是否正确?如果是这样,我该如何解决?

提前致谢!

【问题讨论】:

  • 你看到的是预期的:你有0b11111111,当它移动一个时是0b111111110,即510。
  • 255 是 1111_1111 基数 2。当您使用 &lt;&lt; 1 时,您会将所有位向左移动。因此,这与乘以 2 具有相同的行为:1_1111_1110 base 2 是 510 base 10。
  • 我想你可能想要(b &lt;&lt; 1) &amp; 0xff
  • ishfy 是做什么的?搜索中唯一出现的就是这个问题。看起来你想要b = (b &gt;&gt; i) &lt;&lt; i
  • 按照他说的模式,他似乎想要这个:stackoverflow.com/a/19257710/321337

标签: c++ idl-programming-language


【解决方案1】:

所以,这个程序 100% 正常运行。

如果您希望它“砍掉”高位,则将 b 设为 8 位宽类型,例如 char,或与 0xFF 进行 AND。

【讨论】:

  • 或者用 0xFF 屏蔽它。字符可能不是 8 位宽。
【解决方案2】:

您似乎想清除最低有效位。 左移运算符&lt;&lt; 不这样做。

在这种情况下,您可以执行以下操作:

for(int i = 0; i < 7; i++)
{
    b &= (b - 1);
    cout << b;
}

所以你有:

1st it: 11111111 & 11111110 = 11111110 = 254
2nd it: 11111110 & 11111101 = 11111100 = 252
3rd it: 11111100 & 11111011 = 11111000 = 248
4th it: 11111000 & 11110111 = 11110000 = 240

....

【讨论】:

  • 这假设 b 最初是 2 减一的幂。不过,在他的情况下,情况肯定是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
相关资源
最近更新 更多