对于使用位掩码的程序我渴望以二进制写数字...即要复制的第8位x到z,我写的
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)
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(并丢弃余数).
如果要移位有符号整数,并获得无符号整数语义,请先将其转换为无符号整数.