0

我有一个 16 位数字,例如0x789A,我想将 2 个最高有效位更改为10(设置最高位并清除第二高位)以结束0x989A.

我知道我可以使用设置第一位,n | 0x8000并且可以使用取消设置第二位(在 php 中),n & ~0x4000但是有没有办法10在一个操作中“转换”这两位而不影响较小的位?

同样,我有另一个 16 位数字,比如0xABCD我想将第一个字节的字节值更改为不同的十六进制值,例如5,我最终得到0x5BCD. 有没有办法使用按位运算设置字节?我什至不知道如何开始。

4

2 回答 2

1

完全按照你的方式做,一次做两次,例如

(0x789A & ~0xC000) | 0xC000

    0111100010011010   0x789A
  & 0011111111111111  ~0xC000   ---clear the two relevant bits
  ------------------
 =  0011100010011010   0x389A
  | 1000000000000000   0xC000   --- set their new values
  ------------------
 =  1111100010011010   0xF89A
于 2013-08-28T17:06:01.503 回答
1

这会将 2 个最高有效位设置为 binary 10

0x8000 | ($n & 0x3fff)

这会将最重要的字节设置为 hex 5

0x5000 | ($n & 0x0fff)

一般的想法是,您使用掩码中的 0 位来指定要替换的位,使用 1 来指定要保留的位,然后在替换中使用 OR。

于 2013-08-28T17:07:00.710 回答