Java逐位比较一个字节

时间:2011-12-14 12:15:49

标签: java bit-manipulation

我有一个3字节的值DB(DB_1,DB_2,DB_3)。 我需要检查DB_3的具体位。例如,我必须看看是否  DB_3 == 11X0XXXX 只应检查第4,6和7位。标记为X的位可以采用任何值,不应检查。我不熟悉Java中的Bit操作,很高兴有任何帮助! 谢谢!

4 个答案:

答案 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)

您必须使用面具。您可以使用值和掩码进行一些操作 如果在值中设置了结果,则结果将仅包含该位。

http://www.divnull.com/lward/writing/bitwise.html

答案 2 :(得分:4)

虽然Joey的方法运行得很好,但这是另一种方法,我个人觉得这种方式更直观。

您将需要两个掩码:MASK1 = 11000000定义DB_3的外观,MASK2 = 11010000定义应考虑哪些位。 1中的MASK2位表示我们关注的位,0位表示我们不关心的位。

使用MASK1执行XOR并将其反转,然后使用MASK2执行AND,并检查结果是否等于MASK2。前两个操作会将1DB_3MASK1匹配。第三个操作会将结果中的所有数字都删除到0,但1中的MASK2指示的位除外。当且仅当trueDB_3MASK1指示的位置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)

相关问题