2010-04-16 48 views
1

我无法理解0xFF7F和它下面的两行发生了什么。这里有一个链接可以在一定程度上解释它。 http://www.herongyang.com/java/Bit-String-Set-Bit-to-Byte-Array.html 我不知道0xFF7F >> posBit)& oldByte)& 0x00FF 应该是3个值'AND'在一起,或者这应该如何读取。如果有人能够澄清这里发生的一些事情,我将不胜感激。使用位移和十六进制代码的setBit java方法 - 问题

private static void setBit(byte[] data, 
           final int pos, 
           final int val) { 
     int posByte = pos/8; 
     int posBit = pos%8; 
     byte oldByte = data[posByte]; 
     oldByte = (byte) (((0xFF7F>>posBit) & oldByte) & 0x00FF); 
     byte newByte = (byte) ((val<<(8-(posBit+1))) | oldByte); 
     data[posByte] = newByte; 
    } 

传入此方法,因为selectBits方法的参数是setBit(out,i,val); out =是byte [] out = new byte [numOfBytes]; (在这种情况下,numOfBytes可以是7) i =它是数字[57],它是PC1 int数组中包含56个整数的原始数字。 val =这是从getBit()方法的字节数组中取出的位。

回答

2

首先0xFF7F1111 1111 0111 1111。这是从你传递的位作为一个参数计算出来的位数(这是你想要设置的位)。

如果指定第三位posBit = 3 % 8 = 3所以

0xFF7F 1111 1111 0111 1111 
>> 3 0001 1111 1110 1111 

此值与正在修改的原始字节相与,其结果是,每一位保持等于oldBit原位除了一个是相与与0位,假设你有例如oldByte == 0111 1010,你将获得:

0111 1010 
& 1110 1111 
------------- 
    0110 1010 

则该值为相与0xFF只是丢弃D任何位在演员阵容之前,他不适合一个字节(因为它至少是第九位)。

+0

什么是虽然十六进制数字的意义是什么?为什么在这种情况下选择0xFF7F和0x00FF? – 2010-04-16 22:43:50

+0

它们是_masks_,与AND运算符一起使用来选择一些位。在第一种情况下,使用0xFF7F是因为你想设置一个指定的位,所以除了你想要使用的位(除了__pos__之外)都有1。虽然0x00FF用于选择一对字节的最低字节,因为它只选择低8位。 – Jack 2010-04-16 23:45:12

1

一种更好的方式来写,这将是:

private static void setBit(byte[] data, int index, boolean value) 
{ 
    final int byteIndex = index/8; 
    final int bitIndex = 7 - (index % 8); 

    final byte mask = (byte) (1 << bitIndex); 
    final byte valueBit = value ? mask : 0; 

    data[byteIndex] = (byte) ((data[byteIndex] & ~mask) | valueBit); 
}