在字节数组中插入一个比特

4

我将尝试将一个单独的位插入到字节数组中,这将使字节数组中的所有位向左移动。

假设我有一个Java字节数组如下:

byte[] byteArray = new byte[2];
byteArray[0] = 0x11
byteArray[1] = 0x00

以二进制表示,这个字节数组如下:

0001 0001 0000 0000

现在我想在第三个二进制位添加一个零(丢失字节数组中的最后一位),结果如下:

0000 1000 1000 0000

有没有一种简单的方法在Java中实现这个?我知道BigInteger类可以将整个字节数组转换为二进制字符串(然后插入并转换回来),但那似乎效率低下。谢谢。

我的意思是:“将字节数组中的所有位向右移动” - mike boldischar
4个回答

7

棘手的部分是将字符移动到您实际想要插入位的位置,因为您只想移动其中的一部分。可以使用以下函数来完成此操作:

public static char shift(char in, char n, char v)
{
    char lowMask = (1 << n) - 1;
    char highMask = 0xFF ^ lowMask;

    return (in & lowMask) | ((in & highMask) << 1) | ((v&1) << n);
}

在将位插入第一个字符后,您还需要将其余的数组向右移动。可以通过将一位向右移动(<< 1)并将下一个字符的最低有效位(LSB)设置为上一个字符中最高有效位(MSB)的状态来完成此操作。


2
你需要使用位掩码和位移操作。Java文档中的这一部分可能对你有用:

http://72.5.124.55/docs/books/tutorial/java/nutsandbolts/op3.html

准确来说,您可能想要将字节数组转换为整数,创建一个变量来存储最低位的比特,并将其复制过去,使用与掩码进行位运算从原始变量中屏蔽(AND),对原始变量进行位移,然后使用或掩码重新屏蔽回保留的低位比特。

我需要一些时间来审查这种方法。 :) - mike boldischar
Oracle的正确新链接如下:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html - philipp

1

请查看BitSet类。它可以轻松地完成您所需的操作。


将字节数组转换为位集(BitSet),或者反过来仍然是一个问题,对吗?我需要解析所有的位并将它们的值添加到位集中。 - mike boldischar
2
BitSet 不允许您“插入”位,它只允许您设置它们。它确实允许您迭代位,因此您可以从旧的 BitSet 中重新创建一个新的 BitSet,并逐个增加插入点之后的所有位。不过我怀疑这样做效率不高。 - Will Hartung

0

这个函数适用于单个字节,如果您需要处理更大的内容,可以将其转换为Unicode字符:

static byte InsertBit(byte original, byte location)
        {
            byte highBits=original & ~(1<<location-1) ;
            byte lowBits = (1 << location - 1) & (original >> 1);

            return (1<< location) | highBits |lowBits;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接