Встановити конкретний біт у байті


78

Я намагаюся встановити біти в байтовій змінній Java. Він надає власні методи, такі як .setBit(i). Хтось знає, як я можу це усвідомити?

Я можу виконати ітерацію побітово через заданий байт:

if( (my_byte & (1 << i)) == 0 ){

}

Однак я не можу встановити це положення на 1 або 0, чи не так?



@phuclv Це питання C / C ++, а не питання Java.
Марк Роттівел

@MarkRotteveel використовується той самий синтаксис. Насправді тег слід перейменовувати на щось на зразок C-подібного
phuclv

@phuclv Той факт, що він використовує той самий синтаксис, - на мій погляд - не є достатньою причиною, щоб закрити його як дублікат.
Марк Роттевіл

Відповіді:


143

Використовуйте побітові оператори OR ( |) та AND ( &). Для того, щоб встановити біт, а саме включити біту , posщоб 1:

my_byte = my_byte | (1 << pos);   // longer version, or
my_byte |= 1 << pos;              // shorthand

Щоб трохи зняти або перетворити його на 0:

my_byte = my_byte & ~(1 << pos);  // longer version, or
my_byte &= ~(1 << pos);           // shorthand

Для прикладів див. Додаткові оператори Java / побітові оператори


3
див. також оператор xor - це третій інструмент у цьому арсеналі (див. статтю про маскування у Вікіпедії).
Хардрів

Ого. це насправді базові речі з інформатики, але все одно мене
вразив

67

Щоб встановити трохи:

myByte |= 1 << bit;

Щоб очистити це:

myByte &= ~(1 << bit);

1
що ви маєте на увазі, це трохи "встановить"? скажімо, ви намагалися отримати доступ до 0-го біта, і myByte містить 11101101. Що це означає? Як я можу контролювати значення, яке встановлюється?
Michael

7
@Michael: Встановити біт означає зробити це 1. Очистити біт означає зробити його 0.
Jon Skeet

26

Просто доповнити відповідь Джона і відповідь driis '

Щоб трохи перемкнути (інвертувати)

    myByte ^= 1 << bit;

1
@ernesto, але це конкретно не відповідає на питання. Він запитав, як встановити біт, а не перемикати його. Різниця є. Звичайно, ви можете спочатку перевірити біт, а потім перемкнути його, якщо це потрібно, але це було б також 2 окремими завданнями ...
Джастін Сміт

12

Техніка, яка вам потрібна, полягає у виділенні обраного біта та встановленні або очищенні. У вас уже є вираз для ізоляції біта, оскільки ви використовуєте його для тестування вище. Ви можете встановити біт, OR його ввімкнувши, або очистити біт побітовим І за допомогою доповнення біта до 1.

boolean setBit;
my_byte = setBit
          ? myByte | (1 << i)
          : myByte & ~(1 << i);

8

Будь ласка, перегляньте клас java.util.BitSet, який виконує роботу за вас.

Для встановлення: myByte.set(bit); Для скидання: myByte.clear(bit); Для заповнення bool: myByte.set(bit, b); Для отримання bool: b = myByte.get(bit); Отримати растрове зображення:byte bitMap = myByte.toByteArray()[0];


3
Обережно з бітсетом. Немає різниці між встановленням біта на 0 та його очищенням, тому length()не буде враховувати ті біти, встановлені на 0
Олексій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.