Как проверить мой флаг байта?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

23
задан alex 5 December 2012 в 12:25
поделиться

10 ответов

Вот функция, которая может использоваться для тестирования любого желаемого бита:

bool is_bit_set(unsigned value, unsigned bitindex)
{
    return (value & (1 << bitindex)) != 0;
}

Немного объяснения:

левый оператор смещения (< <) используется для создания небольшой маски. (1 < < 0) будет равно 00000001, (1 < < 1) будет равно 00000010, (1 < < 3) будет равно 00 001 000, и т.д. Так сдвиг 0 тестов самый правый бит. Сдвиг 31 был бы крайним левым битом 32-разрядного значения.

поразрядное - и оператор (&) дает результат, где все биты, которые равняются 1 с обеих сторон, установлены. Примеры: 1 111 & 0001 = 0001; 1 111 & 0010 == 0010; 0000 & 0001 = 0000. Так, выражение (оценивают & (1 < < bitindex)), возвратит битовую маску, если связанный бит будет 1 в значении или возвратится 0, если связанный бит 0.

Наконец, мы просто проверяем, является ли результат ненулевым. (Это могло на самом деле быть не учтено, но мне нравится делать его явным.)

46
ответ дан 2 revs 29 November 2019 в 00:59
поделиться

Как расширение ответа @Daoks

При выполнении побитовой обработки это действительно помогает иметь очень основательное знание побитовые операторы .

Также поразрядный оператор "AND" в C &, поэтому что Вы желаете сделать:

unsigned char a = 0xAA; // 10101010 in hex
unsigned char b = (1 << bitpos); //Where bitpos is the position you want to check

if(a & b) {
    //bit set
}

else {
    //not set
}

Выше я использовал поразрядное "И" (& в C), чтобы проверить, был ли конкретный бит установлен или нет. Я также использовал два различных способа сформулировать двоичные числа. Я настоятельно рекомендую, чтобы Вы проверили ссылку Википедии выше.

6
ответ дан Jerfov2 29 November 2019 в 00:59
поделиться

Можно использовать операцию И. Пример Вы имеете: 10101010 и Вы хотите проверить третий бит, который можно сделать: (10101010 И 00100000) и если Вы добираетесь 00100000, Вы знаете, что у Вас есть флаг в третьем положении к 1.

4
ответ дан Patrick Desjardins 29 November 2019 в 00:59
поделиться

Если бы Вы используете C++, и стандартной библиотеке разрешают, я предложил бы хранить Ваши флаги в bitset:

#include <bitset>
//...
std::bitset<8> flags(someVariable);

, поскольку тогда можно проверить и установить флаги с помощью [] оператор индексирования.

4
ответ дан workmad3 29 November 2019 в 00:59
поделиться

Ответ Kristopher Johnson очень хорош, если Вам нравится работать с отдельными полями как это. Я предпочитаю делать код легче читать при помощи битовых полей в C.

, Например:

struct fieldsample
{
  unsigned short field1 : 1;
  unsigned short field2 : 1;
  unsigned short field3 : 1;
  unsigned short field4 : 1;
}

Здесь у Вас есть простая структура с четырьмя полями, каждый 1 бит в размере. Тогда можно записать код с помощью простого доступа структуры.

void codesample()
{
  //Declare the struct on the stack.
  fieldsample fields;
  //Initialize values.
  fields.f1 = 1;
  fields.f2 = 0;
  fields.f3 = 0;
  fields.f4 = 1;
  ...
  //Check the value of a field.
  if(fields.f1 == 1) {}
  ...
}

Вы получаете то же небольшого размера преимущество плюс читаемый код, потому что можно дать полевые понятные имена в структуре.

4
ответ дан wandercoder 29 November 2019 в 00:59
поделиться

Никто не ошибался до сих пор, но дать метод для проверки произвольного бита:

int checkBit( byte in, int bit )
{
  return in & ( 1 << bit );
}

, Если функциональные ненулевые возвраты, бит установлен.

2
ответ дан Evan Shaw 29 November 2019 в 00:59
поделиться
byte THIRDBIT = 4; // 4 = 00000100 i.e third bit is set

int isThirdBitSet(byte in) {
 return in & THIRDBIT; // Returns 1 if the third bit is set, 0 otherwise
}
1
ответ дан Tnilsson 29 November 2019 в 00:59
поделиться

можно сделать, как Daok заявляет, и Вы делаете немного к биту ИЛИ к получающейся из предыдущей операции И. В этом случае у Вас будет конечный результат 1 или 0.

1
ответ дан Enrico Murru 29 November 2019 в 00:59
поделиться

Традиционно, чтобы проверить, установлен ли самый низкий бит, это посмотрит что-то как:

int MY_FLAG = 0x0001;
if ((value & MY_FLAG) == MY_FLAG)
    doSomething();
1
ответ дан Zach Lute 29 November 2019 в 00:59
поделиться

Используйте поразрядное (не логичный!) и сравнить значение с битовой маской.

if (var & 0x08) {
  /* the fourth bit is set */
}
0
ответ дан Michael Carman 29 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: