Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中更改字节内的位_Java_Bit Manipulation - Fatal编程技术网

在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)));
}