如何在c ++中使用bitshift整数值

时间:2013-10-08 20:20:12

标签: c++ idl-programming-language

我知道这是一个常见的问题,我无法弄清楚为什么我会遇到这么多麻烦。我试图将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转换为二进制形式。它是否正确?如果是这样,我该如何解决?

提前致谢!

2 个答案:

答案 0 :(得分:5)

&LT;&LT;向左移动。如果B最初是255(二进制11111111)并且你向左移动一个你得到111111110(在大多数机器上,int是32位宽,所以有0的空间),这是510的十进制。

所以,这个程序正常工作。

如果你想要“切断”高位,使b为8位宽类型,例如char,或者它为0xFF。

答案 1 :(得分:1)

似乎你想要清除最低有效位。 左移操作符<<不会这样做。

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

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

...