Java 在给定的整数中设置位1-3,并根据需要仅设置位1-3

Java 在给定的整数中设置位1-3,并根据需要仅设置位1-3,java,c++,c,bit-manipulation,bit-fields,Java,C++,C,Bit Manipulation,Bit Fields,如何从x和y中的值计算z中的值 y的第1-3位是011,我希望x中的值的第1-3位替换为y的第1-3位,其他位保持原样。听起来您应该: 屏蔽位1-3,使其无法设置 或y的第1-3位的结果 因此: 请注意,~是按位求逆运算符,因此要清除3位,请取这些位集的倒数,并将该倒数的按位and与当前值一起使用 如果知道在y中只设置位1-3,则可以使用|y而不是|(y&0xe) (请注意,我假设“位1-3”指的是值为8、4和2的位,使用从0开始的正常位计数机制。如果您指的是“底部的三位”,则通常是位0-2

如何从
x
y
中的值计算
z
中的值


y
的第1-3位是
011
,我希望
x
中的值的第1-3位替换为
y
的第1-3位,其他位保持原样。

听起来您应该:

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

请注意,
~
是按位求逆运算符,因此要清除3位,请取这些位集的倒数,并将该倒数的按位and与当前值一起使用

如果知道在
y
中只设置位1-3,则可以使用
|y
而不是
|(y&0xe)


(请注意,我假设“位1-3”指的是值为8、4和2的位,使用从0开始的正常位计数机制。如果您指的是“底部的三位”,则通常是位0-2,并且在代码中使用7而不是0xe。)

听起来您应该:

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

请注意,
~
是按位求逆运算符,因此要清除3位,请取这些位集的倒数,并将该倒数的按位and与当前值一起使用

如果知道在
y
中只设置位1-3,则可以使用
|y
而不是
|(y&0xe)


(请注意,我假设“位1-3”是指值为8、4和2的位,使用从0开始的正常位计数机制。如果是指“底部三位”,则通常是位0-2,并且在代码中使用7而不是0xe。)

@亡灵巫师:好-我会把这一点的澄清留给任何未来想知道的读者,另一件有帮助的事情是如何最好地更新
x
的值,而不是分配给一个新变量
z
@necromancer:Goodo-我将把这一点留给任何未来想知道的读者,另一件有用的事情是如何最好地更新
x
的值,而不是分配给新变量
z
unsigned int x = 0xdeadbeef;
unsigned int y = 0x00000006;
unsigned int z = 0xdeadbee7;
// 0xe == 8 + 4 + 2 (i.e. bits 1-3)
z = (x & ~0xe) | (y & 0xe);