设置/转换集合中的特定位或字节

时间:2013-08-28 16:59:33

标签: php bit-manipulation

我有一个16位数字,如0x789A,我想将2个最高有效位更改为10(设置最高位并清除第二高位),最后得到0x989A 1}}。

我知道我可以使用n | 0x8000设置第一位,我可以使用n & ~0x4000取消设置第二位(在php中)但是有一种方法可以使用{" cast"在一次操作中将两位改为10而不影响较小的位?

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

2 个答案:

答案 0 :(得分:1)

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

(0x789A & ~0xC000) | 0xC000

    0111100010011010   0x789A
  & 0011111111111111  ~0xC000   ---clear the two relevant bits
  ------------------
 =  0011100010011010   0x389A
  | 1000000000000000   0xC000   --- set their new values
  ------------------
 =  1111100010011010   0xF89A

答案 1 :(得分:1)

这会将2个最高有效位设置为二进制10

0x8000 | ($n & 0x3fff)

这会将最重要的字节设置为十六进制5

0x5000 | ($n & 0x0fff)

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