按位摆弄算法

ahe*_*ang 5 algorithm bit-manipulation bitwise-operators

如果我有一个32位二进制数,并且我想用我所拥有的16位数替换二进制数的低16位,并保持该数字的高16位以产生新的二进制数.我怎么能用简单的按位运算符呢?

例如,32位二进制数是:

1010 0000 1011 1111 0100 1000 1010 1001
Run Code Online (Sandbox Code Playgroud)

而我的低16位是:

                    0000 0000 0000 0001
Run Code Online (Sandbox Code Playgroud)

结果是:

1010 0000 1011 1111 0000 0000 0000 0001
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

pol*_*nts 8

您分两步执行此操作:

  • 屏蔽掉你想要替换的位(和0一起)
  • 填写替换(或与新位一起)

所以在你的情况下,

i32 number;
i32 mask_lower_16 = FFFF0000;
i16 newValue;

number = (number AND mask_lower_16) OR newValue;
Run Code Online (Sandbox Code Playgroud)

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

    short v = (short) 0xF00D;
    int number = 0x12345678;
    number = (number & 0xFFFF0000) | (v & 0x0000FFFF);
    System.out.println(Integer.toHexString(number)); // "1234f00d"
Run Code Online (Sandbox Code Playgroud)