Операция побитового сдвига (java)
Недавно начала проходить тему побитового сдвига. Приступила к выполнению задачи и столкнулась с недопониманием кода,который был представлен в литературе:
public class ShowBits {
int numbits;
ShowBits(int in) {
numbits = in;
}
void Show(long val) {
long mask = 1;
mask <<= numbits - 1;
int spacer = 0;
for (; mask != 0; mask >>>= 1) {
if ((val & mask) != 0) System.out.println("1 ");
else System.out.println("0 ");
spacer++;
if (spacer % 8 == 0) {
System.out.println("");
spacer = 0;
}
}
System.out.println();
}
}
class ShowBitsDemo {
public static void main(String[] args) {
ShowBits a = new ShowBits(8);
System.out.println("Число в двоичной системе ");
a.Show(123);
}
}
Не понимаю следующие строки: long mask = 1; mask <<= numbits - 1; И условие цикла for :( Если есть возможность порекомендовать мне какую-либо литературу для изучения этого вопроса,то буду очень благодарна!
Ответы (1 шт):
Автор решения: Aziz Umarov
→ Ссылка
Тут просто
long mask = 1; // 64 бита 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001
mask <<= numbits - 1; // тоже самое что и mask = mask << numbits - 1;
// сдвиг влево на (numbits - 1) бит т.е. если numbits = 5 то результат будет
// mask = mask << 5 - 1
// mask = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000
// на деле умножение mask * pow(2,4) или 1*16
Второй вопрос
for (; mask != 0; mask >>>= 1)
// условие mask != 0 - продолжать пока mask не обнулится
// выражение mask >>>= 1 тоже самое mask = mask >>> 1 или без знаковый сдвиг в
// право на деле деление на 2 или mask = mask >>> 1 это mask/2
По литературе пройдите по ссылке тут
PS. Обратите внимание что побитовые операции являются целочисленными