按位摆弄算法

时间:2010-03-05 05:52:30

标签: algorithm bitwise-operators bit-manipulation

如果我有一个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 个答案:

答案 0 :(得分:8)

您可以分两步完成此操作:

  • 屏蔽掉您要替换的位(与0s对齐)
  • 填写替换件(或新位)

所以在你的情况下,

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"

答案 1 :(得分:3)

(original32BitNumber & 0xFFFF0000) | 16bitNumber

答案 2 :(得分:1)

好吧,我可以告诉你答案。但也许这是功课。所以我不会。

请考虑您有几个选择:

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

也许会画一个小桌子并决定哪一个会给你正确的结果(当你操作较大二进制数的右边部分时)。

答案 3 :(得分:1)

使用&掩盖低位然后|将16位值与32位值合并

 uint  a = 0xa0bf68a9
 short b = 1

 uint  result = (a & 0xFFFF0000) | b;