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