【问题标题】:Insert One Bit into Byte Array将一位插入字节数组
【发布时间】:2010-10-29 08:15:34
【问题描述】:

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

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

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

在二进制中,这个字节数组表示为:

0001 0001 0000 0000

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

0000 1000 1000 0000

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

提前致谢。

【问题讨论】:

  • 我的意思是:“将字节数组中的所有位向右移动”

标签: java binary bit-manipulation byte


【解决方案1】:

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

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

将位插入第一个字符后,您还必须移动数组的其余部分。这可以通过简单地向右移动一位 (

【讨论】:

    【解决方案2】:

    您将要使用位掩码和位移位。这段 Java 文档可能对您有用:

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

    确切地说,您可能希望将字节数组转换为整数,为最低位创建一个变量并将它们复制过来,位掩码(使用 AND 掩码)从您的原始变量,位移原始变量,然后位掩码(使用 OR 掩码)您保留的低位。

    【讨论】:

    【解决方案3】:

    查看BitSet 课程。它可以轻松完成您需要的工作。

    【讨论】:

    • 将字节数组转换为 BitSet,反之亦然,这仍然是个问题,对吗?我必须解析所有位并将它们的值添加到 BitSet。
    • BitSets 不允许您“插入”位,它只是允许您设置它们。它确实允许您迭代位,因此您可以从旧的位集重新创建一个新的位集,并增加插入点之后的所有位。不过,我怀疑这是否有效。
    【解决方案4】:

    这里的这个函数可以在单个字节上工作,如果你需要做更大的事情,你可以转换为 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;
            }
    

    【讨论】:

      猜你喜欢
      • 2012-10-18
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多