为什么按位移位将日期替换为1而不是0?

时间:2016-02-20 14:09:02

标签: c++ bitmask

对于使用位掩码的程序,我希望以二进制形式写入数字......即要将x的前8位复制到z,我写

y = 0xff000000;
z = 0;
z = (y & x) | z

x, y, z全部为int。现在使用左移右移运算符我想向右或向左移动y的1位以掩码另一组位,所以我写下面的代码< / p>

cout<< bitset<32>(y>>10) <<"\n" << bitset<32>(y<<10) <<endl;

现在我的预期输出是:

00000000001111111100000000000000
00000000000000000000000000000000

但我得到了:

11111111111111111100000000000000
00000000000000000000000000000000
  1. 为什么第一行输出的新位'1'为'0'?
  2. 如何将当前输出更改为所需的输出?

1 个答案:

答案 0 :(得分:6)

y是有符号整数。在有符号整数中,最顶部的位是符号位,当右移有符号整数时,最顶部的位传播。

使用8位值:-4是

11111100

当你右移-4时,你认为什么才有意义?

你期望得到-2:

11111110

或者你期望得到126?

01111110

请记住,左移相当于乘2,所以右移相当于除以2(并丢弃其余部分)。

如果要移位有符号整数,并获得无符号整数语义,请先将其转换为无符号整数。