首页 > 解决方案 > 在 c++ 中设置 int64 值的最高四位

问题描述

我有一个 C++ 问题。我需要修改 int64 值的四个最高位。最高位必须为“1”,接下来的三位必须为“0”。该值的其余部分不应更改。

你能帮我吗。谢谢

标签: c++bit

解决方案


要将位设置为 0,可以将位与位与位掩码一起使用:

    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
AND 0000111111111111111111111111111111111111111111111111111111111111
--------------------------------------------------------------------
    0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

要将位设置为 1,您可以将位或与位掩码一起使用:

   0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
OR 1000000000000000000000000000000000000000000000000000000000000000
-------------------------------------------------------------------
   1000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

请注意,这int64是一个有符号整数,并且是用按位和/或具有实现定义的结果修改最高有效位的结果(实际上,这意味着该值取决于负数在系统上的表示方式)。按位运算通常仅对无符号整数执行。

如果您需要对位掩码进行签名,那么自己生成位掩码非常棘手。这是因为将正数左移到不可表示的范围具有未定义的行为。最好创建一个无符号掩码,然后重新解释它。


假设您实际上想要使用 unsigned 代替:

uint64_t input = whatever;
input &= 0x0FFFFFFFFFFFFFFFu;
input |= 0x8000000000000000u;

位掩码也可以使用移位生成,这是对不同大小的整数进行泛化操作的有用方法:

using U = some_unsigned_integer;
U last_byte_offset = (sizeof(U) - 1) * 8;
U and_mask = ~(U(0xF0) << last_byte_offset);
U or_mask  =   U(0x80) << last_byte_offset;

推荐阅读