为何(array[3] & 0xf0) == 0xe0可判断数组第4字节为0xe0-0xeF?
为什么
(array[3] & 0xf0) == 0xe0能检查目标范围? 这个技巧其实是利用了位运算的掩码特性,咱们一步步拆解就懂了:
1. 先看你要检查的数值范围
你要找的是0xe0到0xef之间的十六进制值,把它们转成二进制看的话:
0xe0=1110 00000xe1=1110 0001- ...
0xef=1110 1111
这些数的共同特点是:高4位固定为1110(也就是十六进制的0xe),低4位可以是任意值(015,对应十六进制0f)。
2. 拆解array[3] & 0xf0的作用
0xf0是一个掩码,二进制是1111 0000。按位与(&)运算的规则是:只有两个对应位都为1时,结果位才是1,否则为0。
所以当你用array[3]和0xf0做按位与时:
array[3]的低4位会被全部清零(因为掩码的低4位都是0,不管原数低4位是什么,与运算后都是0)- 只保留
array[3]的高4位(掩码的高4位都是1,与运算后会原封不动保留原数的高4位)
3. 最后比较== 0xe0的意义
0xe0的二进制是1110 0000,它的高4位正好是咱们要找的0xe,低4位是0。
所以当array[3]的高4位是0xe时,经过&0xf0操作后,结果必然是0xe0——这就意味着原数一定在0xe0到0xef这个范围内,完美覆盖了你要检查的所有值!
举个实际例子:
- 如果
array[3]是0xe5(二进制1110 0101),和0xf0按位与后得到1110 0000即0xe0,条件成立 - 如果
array[3]是0xd9(二进制1101 1001),按位与后得到1101 0000即0xd0,不等于0xe0,条件不成立
这种方法比逐个写==判断要简洁得多,而且位运算在底层执行效率也更高~
内容的提问来源于stack exchange,提问作者Sarwar Khalid
相关产品推荐
相关产品推荐

