我无法理解0xFF7F和它下面的一行中发生的情况。这里有一个链接可以在某种程度上解释它。 http://www.herongyang.com/java/Bit-String-Set-Bit-to-Byte-Array.html 我不知道0xFF7F>> posBit)& oldByte)&设为0x00FF 应该是3个值“和”在一起或如何读取它。如果有人能够更好地澄清这里发生的事情,我将非常感激。
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()方法的字节数组中取出的位。
答案 0 :(得分:2)
首先0xFF7F
是1111 1111 0111 1111
。这会从您作为参数传递的位计算出的位数向右移动(因此您想要设置的位数)。
如果指定第三位posBit = 3 % 8 = 3
,那么
0xFF7F 1111 1111 0111 1111
>> 3 0001 1111 1110 1111
然后将该值与您正在修改的原始字节进行AND运算,结果是每个位保持等于oldBit
原始位,除了与0
位相关的位,假设您例如oldByte == 0111 1010
,您将获得:
0111 1010
& 1110 1111
-------------
0110 1010
然后该值以0xFF
为止,只是为了在执行转换之前丢弃任何不适合字节的位(因为它至少是第9位)。
答案 1 :(得分: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);
}