Вставить один бит в массив байтов

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

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

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

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

0001 0001 0000 0000

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

0000 1000 1000 0000

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

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


person Community    schedule 27.05.2009    source источник
comment
Я имел в виду: сдвинуть все биты в массиве байтов вправо   -  person    schedule 27.05.2009


Ответы (4)


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

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

person Emil H    schedule 27.05.2009

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

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

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

person Paul Sonier    schedule 27.05.2009
comment
Мне понадобится время, чтобы пересмотреть этот подход. :) - person ; 27.05.2009
comment
Правильная новая ссылка от Oracle следующая: docs.oracle.com/ javase / tutorial / java / nutandbolts / op3.html. - person philipp; 20.04.2012


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