我有一个3字节的值DB(DB_1,DB_2,DB_3)。
我需要检查DB_3的具体位。例如,我必须看看是否
DB_3 == 11X0XXXX
只应检查第4,6和7位。标记为X
的位可以采用任何值,不应检查。我不熟悉Java中的Bit操作,很高兴有任何帮助!
谢谢!
答案 0 :(得分:21)
您可以使用按位AND(Java中的&
)来完成对特定位的屏蔽(掩码是第二行,并且只允许第一行的那些位通过掩码具有{{ 1}} [在计算下面标有箭头]):
1
您将完全保留两个操作数中 11101001
& 11010000
----------
11000000
↑↑ ↑
的那些位,因此基本上您将所有这些位设置为您不感兴趣的1
。
所以你只需要做
0
if (DB_3 & 0xD0 == 0xC0) { ... }
是0xD0
的十六进制格式,二进制格式为208
,您想知道它是否与11010000
0xC0
匹配,或{ {1}}。由于按位AND,你会知道你不关心的所有位(你问题中的192
es)此时已经为零。
ETA (2011-12-14 14:24):显然Java 7有binary integer literals,所以你可以做到
11000000
使面具更容易明显。谢谢,Glenn。
答案 1 :(得分:7)
您必须使用面具。您可以使用值和掩码进行一些操作 如果在值中设置了结果,则结果将仅包含该位。
答案 2 :(得分:4)
虽然Joey的方法运行得很好,但这是另一种方法,我个人觉得这种方式更直观。
您将需要两个掩码:MASK1 = 11000000
定义DB_3
的外观,MASK2 = 11010000
定义应考虑哪些位。 1
中的MASK2
位表示我们关注的位,0
位表示我们不关心的位。
使用MASK1
执行XOR并将其反转,然后使用MASK2
执行AND,并检查结果是否等于MASK2
。前两个操作会将1
与DB_3
和MASK1
匹配。第三个操作会将结果中的所有数字都删除到0
,但1
中的MASK2
指示的位除外。当且仅当true
与DB_3
中MASK1
指示的位置1
匹配时,对比评估为MASK2
。
int MASK1 = Integer.parseInt("11000000", 2); // tell parseInt to use base 2
int MASK2 = Integer.parseInt("11010000", 2);
boolean matches = (~(DB_3 ^ MASK1) & MASK2) == MASK2;
按位运算的示例:
11101001
^ 11000000
----------
00101001
~
----------
11010110
& 11010000
----------
11010000
我希望这是可以理解的。
答案 3 :(得分:1)