在java中更改字节内的位
所以我知道如何在一个字节内改变一个位,但我不确定的是为什么我的特定代码不起作用在java中更改字节内的位,java,bit-manipulation,Java,Bit Manipulation,所以我知道如何在一个字节内改变一个位,但我不确定的是为什么我的特定代码不起作用 public static void setBit(byte[] input, int position, int value) { int byteLocation = position / 8; int bitLocation = position % 8; byte tempByte = input[byteLocation]; if (value == 0) tem
public static void setBit(byte[] input, int position, int value) {
int byteLocation = position / 8;
int bitLocation = position % 8;
byte tempByte = input[byteLocation];
if (value == 0)
tempByte = (byte) (tempByte & ~(1 << bitLocation));
else
tempByte = (byte) (tempByte | (1 << bitLocation));
input[byteLocation] = tempByte;
}
将格式更改为
Integer.toBinaryString(0xFF & bytes[i])
字节需要屏蔽,因为它是符号扩展的,而不是零扩展的,32位int
public static void setBit(字节[]输入,int位置,int值){
int字节位置=位置/8;
int位位置=位置%8;
输入[byteLocation]=(字节)(输入[byteLocation]^(字节)(1问题是您正在设置相关字节中的符号位。因此,该字节现在有一个负值。您可以调用Integer.toBinaryString()
,它将int作为参数,而不是字节。字节将升级为int,并正确计算以下值:
11101110
到它的等效整数:
11111111111111111111111111101110
我没有太详细地研究它,但我认为一咬的问题是它被扩展到了一个int(因为它是有符号的,所以1扩展到了一个负int)
只要取字符串的最后8个字符,它就可以正常工作。我最近不得不这样做。
我通过(大量使用白板,但…)将原始位向右移动我要替换的LSB的位置,并使所有位(包括我要替换的MSB)都为1来实现它。
然后,我用我想要的位来代替我想要替换的位,左移和右移相同的数字,或者用原始的结果和替换的XOR掩码进行AND运算。(深吸一口气,我会尽力解释)
假设我有字节:
1111010001001
我想用0001来代替nibble 1010来产生:
1111 0001 0001 1001.
我实现这一目标的操作是:
1) 向右移动8以生成:
0000 0000 1111 1010
2) 或生成0xf(1111)的掩码:
0000 0000 1111111 1111
3) 将0001替换为0000 0000 1111 1111,生产:
0000 0000 0001
4) 向左移动8以生成:
0000 0001 0000
5) 按LSB位置移动掩码,并用全字节异或
1111111111111111111
0000 1111 0000 0000
=========================
111100001111111111
6) 和原版的异或移位掩模一起产生:
1111 0000 0001 1001
111100001111111111
=========================
111100000001 1001
7) 或者上述替换结果:
1111 0000 0001 1001
0000 0001 0000
=========================
1111 0001 0001 1001>shift)| mask)&with)你的setBit()方法做什么?忘记了方法标题“我的坏”,现在编辑它们:)
public static void setBit(byte[] input, int position, int value) {
int byteLocation = position / 8;
int bitLocation = position % 8;
input[byteLocation] = (byte) (input[byteLocation] ^ (byte) (1 << bitLocation));
}
11101110
11111111111111111111111111101110
public long overwriteBits(long overwrite, long with, long shift, long mask)
{
return ((((overwrite >> shift) | mask) & with) << shift) | (overwrite & (~0 ^ (mask << shift)));
}