Эквивалент LargeInteger's testBit BigInteger?
Есть ли LargeInteger
иметь эквивалент BigInteger
"s testBit
?
Если нет, то как testBit
исполняться на LargeInteger
?
У меня пока нет необходимых навыков для размножения ((this & (1<<n)) != 0)
,
Я попытался создать метод, просто скопировав и вставив приведенный выше код, указанный в документах:
static boolean testBit(int n){
return ((this & (1<<n)) != 0);
}
Тем не менее, компилятор сообщает:
error: non-static variable this cannot be referenced from a static context
return ((this & (1<<n)) != 0);
^
error: bad operand types for binary operator '&'
return ((this & (1<<n)) != 0);
^
1 ответ
Это лучшее, что я могу придумать, учитывая API:
static boolean testBit(LargeInteger i, int n) {
return i.shiftRight(n).isOdd();
}
n
это позиция проверяемого бита.
Я предполагаю, что вы поместили этот метод в некоторый служебный класс.
объяснение
Обычно, вы бы сделали num & (1 << pos)
извлечь бит в pos
позиция:
???????x?????
0000000100000
-------------
0000000x00000
Если все это 0, то x
0; иначе, x
это 1.
В методе выше я делаю num >> pos
:
???????x?????
-------------
????????????x
Мы знаем, что двоичное число является нечетным, когда его младший значащий бит равен 1, и это четное, когда его младший значащий бит равен 0.
Так что если число после сдвига вправо нечетно, мы знаем, что бит равен 1; если даже, мы знаем, что бит равен 0.