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二进制,你想知道它是否匹配0xC0是192,或11000000.X由于按位AND,您将知道此时您不关心的所有位(问题中的es)已经为零.
ETA(2011-12-14 14:24):显然Java 7有二进制整数文字,所以你可以做到
if (DB_3 & 0b11010000 == 0b11000000) { ... }
Run Code Online (Sandbox Code Playgroud)
这使面具更容易明显.谢谢,格伦.
虽然乔伊的方法工作得很好,但我个人认为这是另一种更直观的方法。
您将需要两个掩码:MASK1 = 11000000它定义了DB_3应该看起来如何,以及MASK2 = 11010000它定义应考虑哪些位。1位MASK2表示我们关心的位,0位表示我们不关心的位。
执行 XORMASK1并反转它,然后执行 ANDMASK2并检查结果是否等于MASK2。前两个操作将放置1s whereDB_3和MASK1match。第三个操作将删除结果中的所有数字,0除了由1s in指示的位MASK2。true当且仅当在由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)
我希望这是可以理解的。