Java逐位比较一个字节

tzi*_*ppy 8 java bit-manipulation

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

Joe*_*oey 21

您可以使用按位AND(&在Java中)来完成对特定位的屏蔽(屏蔽是第二行,并且只允许第一行的那些位通过掩码具有1[在计算下方用箭头标记]的位置):

  11101001
& 11010000
----------
  11000000
  ?? ?
Run Code Online (Sandbox Code Playgroud)

您将保留1两个操作数中的那些位,因此基本上您将所有这些位设置为0您不感兴趣的位.

所以你只需要做

if (DB_3 & 0xD0 == 0xC0) { ... }
Run Code Online (Sandbox Code Playgroud)

0xD0是十六进制形式的208这是11010000二进制,你想知道它是否匹配0xC0192,或11000000.X由于按位AND,您将知道此时您不关心的所有位(问题中的es)已经为零.


ETA(2011-12-14 14:24):显然Java 7有二进制整数文字,所以你可以做到

if (DB_3 & 0b11010000 == 0b11000000) { ... }
Run Code Online (Sandbox Code Playgroud)

这使面具更容易明显.谢谢,格伦.

  • 我猜Java 7有二进制文字:http://docs.oracle.com/javase/7/docs/technotes/guides/language/binary-literals.html (2认同)

hel*_*nic 7

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

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


Emi*_*erg 5

虽然乔伊的方法工作得很好,但我个人认为这是另一种更直观的方法。

您将需要两个掩码:MASK1 = 11000000它定义了DB_3应该看起来如何,以及MASK2 = 11010000它定义应考虑哪些位。1MASK2表示我们关心的位,0位表示我们不关心的位。

执行 XORMASK1并反转它,然后执行 ANDMASK2并检查结果是否等于MASK2。前两个操作将放置1s whereDB_3MASK1match。第三个操作将删除结果中的所有数字,0除了由1s in指示的位MASK2true当且仅当在由s in指示的位置DB_3匹配MASK1时,比较计算结果。1MASK2

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;
Run Code Online (Sandbox Code Playgroud)

按位运算示例:

  11101001
^ 11000000
----------
  00101001
~
----------
  11010110
& 11010000
----------
  11010000
Run Code Online (Sandbox Code Playgroud)

我希望这是可以理解的。