Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
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 ");
}
}
}
Давайте использовать 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!!
Я сказал бы, что лучшая вещь сделать состоит в том, чтобы убрать проблему вручную, тот способ, которым Вы поймете, как это работает.
Вот то, что я сделал использование 8-разрядного неподписанного интервала
, Наше число равняется 75, мы хотим 4 бита, начинающие с положения 6. призыв к функции был бы getbits (75,6,4);
75 в двоичном файле 0100 1011
, Таким образом, мы создаем маску, которая является запуском 4 бита длиной с бита самого низкоуровневого, это сделано как таковое.
~0 = 1111 1111
< < 4 = 1111 0000
~ = 0000 1111
Хорошо мы получили нашу маску.
0100 1011>> 3 0000 1001
Теперь у нас есть маска корректного числа битов в младшем разряде и битов, которые мы хотим из исходного числа в младшем разряде.
0000 1001
& 0000 1111 ============ 0000 1001
, таким образом, ответ десятичный 9.
Примечание: откусывание высшего порядка просто, оказывается, все нули, сокращая маскирование в этом случае, но это, возможно, было что-либо в зависимости от значения числа, с которого мы запустили.
~(~0 << n)
создает маску, которая будет иметь n
самые правые биты включенный.
0
0000000000000000
~0
1111111111111111
~0 << 4
1111111111110000
~(~0 << 4)
0000000000001111
Выполнение операции "И" результат с чем-то еще возвратит то, что находится в тех n
биты.
Редактирование: Я хотел указать на калькулятор этого программиста, который я использовал навсегда: AnalogX PCalc.
Используя пример: интервал 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
Вы помните, как логические операции работают?