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

95_*_*_96 2 c++ bitmask

对于使用位掩码的程序我渴望以二进制写数字...即要复制的第8位xz,我写的

y = 0xff000000;
z = 0;
z = (y & x) | z
Run Code Online (Sandbox Code Playgroud)

哪里x, y, z都有int.现在使用左移右移运算符我想y向右或向左移动1s 来掩码另一组位,所以我写下面的代码

cout<< bitset<32>(y>>10) <<"\n" << bitset<32>(y<<10) <<endl;
Run Code Online (Sandbox Code Playgroud)

现在我的预期输出是:

00000000001111111100000000000000
00000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

但我得到了:

11111111111111111100000000000000
00000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
  1. 为什么第一行输出中的新位'1'为'0'?
  2. 如何将电流输出更改为所需的输出?

Sam*_*hik 6

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

使用八位值:-4是

11111100
Run Code Online (Sandbox Code Playgroud)

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

你期望得到-2:

11111110
Run Code Online (Sandbox Code Playgroud)

或者你期望得到126?

01111110
Run Code Online (Sandbox Code Playgroud)

请记住,左移相当于乘以2,因此右移相当于除以2(并丢弃余数).

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