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

在c+;中设置int64值的最高四位+; 我有一个C++问题。我需要修改int64值的四个最高位。 最高位必须为“1”,下三位必须为“0”。该值的其余部分不应更改,c++,bit,C++,Bit,你能帮帮我吗。感谢将位设置为0,您可以使用位掩码按位和: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb AND 0000111111111111111111111111111111111111111111111111111111111111 -------------------------------------------------------------------- 0000bbbbbb

你能帮帮我吗。感谢将位设置为0,您可以使用位掩码按位和:

    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
AND 0000111111111111111111111111111111111111111111111111111111111111
--------------------------------------------------------------------
    0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
   0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
OR 1000000000000000000000000000000000000000000000000000000000000000
-------------------------------------------------------------------
   1000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
要将位设置为1,可以使用按位或位掩码:

    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
AND 0000111111111111111111111111111111111111111111111111111111111111
--------------------------------------------------------------------
    0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
   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;
使用U=某个无符号整数;
最后一个字节偏移量=(sizeof(U)-1)*8;

U和_掩码=~(U(0xF0)首先为3位创建掩码:

0b0111 << 60

0b0111首先,我们需要一个掩码,除了4个最高位之外,它在任何地方都是1:

int64 mask = ~ (int64(0xf) << 60);
但我们需要最高位为1。为此,请按位或使用二进制100…00:

x = x | (int64(1) << 63);
x=x |(int64(1)
x=(x | 0x8000000)&0x8fffffff;

第一部分,
(x | 0x8000000)
,将最高位设置为1。
第二部分,
&0x8fffffff
,将下一个最高的三位设置为零。

您尝试了什么?您可以用较小的数字来做吗,例如16位?您尝试了什么,以及它是如何失败的?看看do和二进制操作,看看数字Look现在似乎不错。小的挑剔7似乎太神奇了。我推荐
0b0111
相反,从位模式的角度来看,这是显而易见的。就是这样。谢谢!
x = x | (int64(1) << 63);