Нуждаюсь в помощи понимая “getbits ()” метод в Главе 2 K&R C

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
28
задан Gaurang Tandon 3 July 2018 в 10:58
поделиться

4 ответа

Давайте использовать 16 битов для нашего примера. В этом случае, ~0 равно

1111111111111111

, Когда мы сдвиг влево это n биты (3 в Вашем случае), мы добираемся:

1111111111111000

, потому что 1 с слева отбрасываются и 0, с подаются справа. Тогда повторное образование это дает:

0000000000000111

, таким образом, это - просто умный способ добраться n 1 бит в наименее значительной части числа.

"x бит" Вы описываете, сместил данное право номер (f994) достаточно далеко так, чтобы младшие значащие 3 бита были теми, Вы хотите. В этом примере биты, которые Вы запрашиваете, окружаются '.' символами.

ff94             11111111100.101.00  # original number
>> p+1-n     [2] 0011111111100.101.  # shift desired bits to right
& ~(~0 << n) [7] 0000000000000.101.  # clear all the other (left) bits

И там у Вас есть свои биты. Ta da!!

38
ответ дан paxdiablo 28 November 2019 в 03:01
поделиться

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

Вот то, что я сделал использование 8-разрядного неподписанного интервала

  1. , Наше число равняется 75, мы хотим 4 бита, начинающие с положения 6. призыв к функции был бы getbits (75,6,4);

  2. 75 в двоичном файле 0100 1011

  3. , Таким образом, мы создаем маску, которая является запуском 4 бита длиной с бита самого низкоуровневого, это сделано как таковое.

~0 = 1111 1111
< < 4 = 1111 0000
~ = 0000 1111

Хорошо мы получили нашу маску.

  1. Теперь, мы продвигаем биты, которые мы хотим из числа в биты самые низкоуровневые, таким образом, мы смещаем двоичные 75 на 6+1-4=3.

0100 1011>> 3 0000 1001

Теперь у нас есть маска корректного числа битов в младшем разряде и битов, которые мы хотим из исходного числа в младшем разряде.

  1. так мы & их
  0000 1001 
& 0000 1111 ============ 0000 1001

, таким образом, ответ десятичный 9.

Примечание: откусывание высшего порядка просто, оказывается, все нули, сокращая маскирование в этом случае, но это, возможно, было что-либо в зависимости от значения числа, с которого мы запустили.

11
ответ дан None 28 November 2019 в 03:01
поделиться

~(~0 << n) создает маску, которая будет иметь n самые правые биты включенный.

0
   0000000000000000
~0
   1111111111111111
~0 << 4
   1111111111110000
~(~0 << 4)
   0000000000001111

Выполнение операции "И" результат с чем-то еще возвратит то, что находится в тех n биты.

Редактирование: Я хотел указать на калькулятор этого программиста, который я использовал навсегда: AnalogX PCalc.

6
ответ дан David Grant 28 November 2019 в 03:01
поделиться

Используя пример: интервал x = 0xF994, p = 4, n = 3; интервал z = getbits (x, p, n);

и фокусирующийся на этом наборе операций ~ (~0 < < n)

для любого набора битов (10010011 и т.д.) Вы хотите генерировать "маску", которая вытягивает только биты, которые Вы хотите видеть. Так 10010011 или 0x03, я интересуюсь xxxxx011. Какова маска, которая извлечет тот набор? 00000111 Теперь я хочу быть sizeof международным независимым политиком, я позволю машине сделать работу т.е. запуститься с 0 для машины байта, это - 0x00 для машины слова, это - 0x0000 и т.д. машина, на 64 бита представила бы на 64 бита, или 0x0000000000000000

Теперь применяются "не" (~0) и добираются 11111111
право сдвига (< <) n и добираются 11111000
и "не" это и добираются 00000111

так 10 010 011 & 00000111 = 00000011
Вы помните, как логические операции работают?

2
ответ дан 28 November 2019 в 03:01
поделиться
Другие вопросы по тегам:

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