将一位插入字节数组

时间:2009-05-27 16:45:47

标签: java binary bit-manipulation byte

我正在尝试将一个位插入一个字节数组,这会将字节数组中的所有位移到左侧。

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

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

在二进制文件中,此字节数组表示为:

0001 0001 0000 0000

现在我想在第三位位置插入一个零(丢失字节数组中的最后一位),结果是:

0000 1000 1000 0000

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

提前致谢。

4 个答案:

答案 0 :(得分: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);
}

将位插入第一个字符后,您还必须移动阵列的其余部分。这可以通过简单地向右移位一位(&lt;&lt;&lt;&lt; 1)并将下一个字符的最低有效位(LSB)设置为最后一个字符中的最高有效位(MSB)的状态来完成。

答案 1 :(得分:2)

你将要使用bitmasking和bitshifting。这些Java文档可能对您有用:

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

准确地说,你可能想要将你的字节数组转换为一个整数,为你的最低位创建一个变量并将它们复制过来,用bitmask out(使用AND掩码)来自你的那些位原始变量,bithift原始变量,然后返回位(使用OR掩码)你保留的低位比特。

答案 2 :(得分:1)

查看BitSet课程。它可以非常简单地完成你需要的工作。

答案 3 :(得分:0)

此函数可以在单个字节上运行,如果需要做更大的事情,可以转换为unicode CHAR:

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