为什么按位移位在这里用 1s 而不是 0 替换日期?
why does bitwise shift replace date with 1s instead of 0 here?
对于使用位掩码的程序,我希望以二进制形式写入数字...即要将 x
的前 8 位复制到 z
,我编写
y = 0xff000000;
z = 0;
z = (y & x) | z
其中x, y, z
都是int
。现在使用 left shift 和 right shift 运算符我想将 y
的 1s 向右或向左移动以掩码另一组位,所以我写了下面的代码
cout<< bitset<32>(y>>10) <<"\n" << bitset<32>(y<<10) <<endl;
现在我期望的输出是:
00000000001111111100000000000000
00000000000000000000000000000000
但我得到了:
11111111111111111100000000000000
00000000000000000000000000000000
- 为什么输出第一行的新位是“1”而不是“0”?
- 如何将当前输出更改为所需的输出?
y 是一个带符号的整数。在有符号整数中,最高位是符号位,当您右移有符号整数时,最高位会传播。
使用八位值:-4 是
11111100
当您右移 -4 时,您认为什么有意义?
你希望得到-2:
11111110
或者你希望得到126?
01111110
请记住,左移相当于乘以 2,因此右移相当于除以 2(并舍弃余数)。
如果要移位有符号整数并获得无符号整数语义,请先将其转换为无符号整数。
对于使用位掩码的程序,我希望以二进制形式写入数字...即要将 x
的前 8 位复制到 z
,我编写
y = 0xff000000;
z = 0;
z = (y & x) | z
其中x, y, z
都是int
。现在使用 left shift 和 right shift 运算符我想将 y
的 1s 向右或向左移动以掩码另一组位,所以我写了下面的代码
cout<< bitset<32>(y>>10) <<"\n" << bitset<32>(y<<10) <<endl;
现在我期望的输出是:
00000000001111111100000000000000
00000000000000000000000000000000
但我得到了:
11111111111111111100000000000000
00000000000000000000000000000000
- 为什么输出第一行的新位是“1”而不是“0”?
- 如何将当前输出更改为所需的输出?
y 是一个带符号的整数。在有符号整数中,最高位是符号位,当您右移有符号整数时,最高位会传播。
使用八位值:-4 是
11111100
当您右移 -4 时,您认为什么有意义?
你希望得到-2:
11111110
或者你希望得到126?
01111110
请记住,左移相当于乘以 2,因此右移相当于除以 2(并舍弃余数)。
如果要移位有符号整数并获得无符号整数语义,请先将其转换为无符号整数。