在给定int的int中设置位1-3,仅根据需要设置位1-3

nec*_*cer 1 c c++ java bit-manipulation bit-fields

unsigned int x = 0xdeadbeef;
unsigned int y = 0x00000006;
unsigned int z = 0xdeadbee7;
Run Code Online (Sandbox Code Playgroud)

如何计算值z从价值观xy

第1-3位y011,我希望将值1-3中的x位1-3替换为第1-3位,y将其他位保持原样.

Jon*_*eet 6

听起来你应该:

  • 屏蔽1-3位,使其无法设置
  • 或者结果与y的第1-3位

所以:

// 0xe == 8 + 4 + 2 (i.e. bits 1-3)
z = (x & ~0xe) | (y & 0xe);
Run Code Online (Sandbox Code Playgroud)

注意,它~是按位运算符,因此要清除3位,您可以取这些位的反转,并使用该逆的按位AND和当前值.

如果您知道只有1-3位将被设置,您可以使用| y而不是.| (y & 0xe)y

(注意,我假设"1-3位"表示值为8,4和2的位,使用从0开始的正常位计数机制.如果您的意思是"底部三位",那么通常是0-2位,你在代码中使用7而不是0xe.)