我有一个16位数字,如0x789A
,我想将2个最高有效位更改为10
(设置最高位并清除第二高位),最后得到0x989A
1}}。
我知道我可以使用n | 0x8000
设置第一位,我可以使用n & ~0x4000
取消设置第二位(在php中)但是有一种方法可以使用{" cast"在一次操作中将两位改为10
而不影响较小的位?
同样,我有另一个16位数字,比如0xABCD
,我想将第一个字节的字节值更改为不同的十六进制值,例如5
,这样我最终得到0x5BCD
。有没有办法使用按位运算设置字节?我甚至不确定如何开始这个。
答案 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。