Вставьте один бит в байтовый массив - PullRequest
4 голосов
/ 27 мая 2009

Я пытаюсь вставить один бит в массив байтов, который сдвинет все биты в байтовом массиве влево.

Скажем, у меня есть байтовый массив Java следующим образом:

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

В двоичном виде этот байтовый массив представлен как:

0001 0001 0000 0000

Теперь я хочу вставить ноль в третью битовую позицию (теряя последний бит в байтовом массиве), в результате чего:

0000 1000 1000 0000

Есть ли простой способ сделать это на Java? Мне известен класс BigInteger, который может преобразовывать весь байтовый массив в двоичную строку (затем вставлять таким образом и преобразовывать обратно), но это кажется неэффективным.

Заранее спасибо.

Ответы [ 4 ]

7 голосов
/ 27 мая 2009

Сложный бит состоит в том, чтобы сместить символ туда, где вы на самом деле хотите вставить бит, потому что вы хотите сместить только его часть. Это можно сделать с помощью такой функции:

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) в последнем символе. </p>

2 голосов
/ 27 мая 2009

Вы захотите использовать битовую маску и битрейфтинг. Этот бит документации Java может быть полезен для вас:

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

Если быть точным, вы, вероятно, захотите преобразовать свой байтовый массив в целое число, создать переменную для ваших младших битов и скопировать их, маскировать биты (используя маску AND) из этих битов. исходная переменная, битовое смещение исходной переменной, затем битовая маска (используя маску ИЛИ) сохраненные вами младшие биты.

1 голос
/ 27 мая 2009

Проверьте класс BitSet . Он может делать то, что вам нужно, довольно тривиально.

0 голосов
/ 25 октября 2009

Эта функция будет работать с одним байтом, вы можете преобразовать в кодировку 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;
        }
...