c++ - 为什么按位移位在这里用 1s 而不是 0 替换日期?

标签 c++ bitmask

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

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

其中x, y, z 都是int。现在使用 left shiftright shift 运算符我想将 y 的 1s 向右或向左移动以位掩码另一组位,所以我写了以下代码

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

现在我期望的输出是:

00000000001111111100000000000000
00000000000000000000000000000000

但是我得到了:

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

最佳答案

y 是一个带符号的整数。在有符号整数中,最高位是符号位,当您右移有符号整数时,最高位传播。

使用八位值:-4 是

11111100

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

你期望得到-2吗:

11111110

还是希望得到126?

01111110

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

如果你想移动一个有符号整数,并获得无符号整数语义,首先将它转换为一个无符号整数。

关于c++ - 为什么按位移位在这里用 1s 而不是 0 替换日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35524391/

相关文章:

c# - 这种类型的功能或技术有名称吗?

c++ - 为什么我的 std::unordered_map 访问时间不是常量

c++ - 包含 Bazel header 时如何允许角 "<>"括号?

sql - 位掩码的大小是否有实际限制?

c# - 查找整数的集合位

c - 编写并使用一个将掩码作为参数并返回结构的函数

c++ - 计时器精度 : c clock( ) vs. WinAPI 的 QPC 或 timeGetTime( )

c++ - 有没有办法打开一个允许我只编辑几个字节的文件?

c++ - 从字符串中拆分 int

c - 按位循环遍历大数据 block 的最快方法是什么