5

如果我有一个 32 位二进制数,并且我想用我拥有的 16 位数字替换该二进制数的低 16 位,并保留该数字的高 16 位以产生一个新的二进制数。如何使用简单的按位运算符来做到这一点?

例如 32 位二进制数是:

1010 0000 1011 1111 0100 1000 1010 1001

我拥有的较低的 16 位是:

                    0000 0000 0000 0001

所以结果是:

1010 0000 1011 1111 0000 0000 0000 0001

我怎样才能做到这一点?

4

4 回答 4

8

您分两步执行此操作:

  • 屏蔽掉要替换的位(并用 0 替换)
  • 填写替换项(或使用新位)

所以在你的情况下,

i32 number;
i32 mask_lower_16 = FFFF0000;
i16 newValue;

number = (number AND mask_lower_16) OR newValue;

在实际的编程语言实现中,您可能还需要解决 16 位值的符号扩展问题。例如,在 Java 中,您必须short像这样屏蔽高 16 位:

    short v = (short) 0xF00D;
    int number = 0x12345678;
    number = (number & 0xFFFF0000) | (v & 0x0000FFFF);
    System.out.println(Integer.toHexString(number)); // "1234f00d"
于 2010-03-05T05:55:00.637 回答
3
(original32BitNumber & 0xFFFF0000) | 16bitNumber
于 2010-03-05T05:55:16.157 回答
1

好吧,我可以告诉你答案。但也许这是家庭作业。所以我不会。

考虑到您有几个选择:

| // bitwise OR
^ // bitwise XOR
& // bitwise AND

也许画一个小表并决定哪一个会给你正确的结果(当你在更大的二进制数的正确部分进行操作时)。

于 2010-03-05T05:55:41.600 回答
1

使用 & 屏蔽低位,然后 | 将 16 位值与 32 位值合并

 uint  a = 0xa0bf68a9
 short b = 1

 uint  result = (a & 0xFFFF0000) | b;
于 2010-03-05T05:56:12.847 回答