int v = n & (int) Math.round(Math.pow(2, location));
Math.pow(2, location)
повышает уровень 2 до заданной мощности. Это округляется и преобразуется в целое число. В двоичном формате это будет 00000001, если location==0
, 00000010, если location==1
, 00000100, если location==2
и т. Д. (Намного лучше будет 1 << location
, который сдвигает «1» на определенное количество бит, заполняя 0 бит справа. Использование Math.pow
будет вероятно, попытайтесь вычислить логарифм 2 при каждом его вызове.)
n & ...
побитовое И. Так как элемент справа имеет только один бит, эффект равен нулю каждый бит в n
, за исключением этого одного бита, и поместите результат в v
. Это означает, что v
будет 0, если это один бит 0 в n
, а что-то другое, чем 0, если этот бит является `, что означает
return v==0?0:1;
возвращает 0, если бит сброшен, и 1, если он установлен.
int toggle = (int) Math.pow(2, location), bv = getBitValue(n, location);
toggle
установлен этот Math.pow
вещь, которую я уже описал. bv
устанавливается в бит, который уже в n
, что 0 или 1. Если это равно вещь вы устанавливаете его, то нам не нужно ничего делать, чтобы n
:
if(bv == bit)
return n;
В противном случае, либо нам нужно установить его на 1 (помните, что toggle
будет иметь только один бит). n |= toggle
- это то же самое, что и n = n | toggle
. |
является побитовое ИЛИ, так что один бит будет установлен в n
и все остальные биты в n
останутся те же»
if(bv == 0 && bit == 1)
n |= toggle;
Или нам нужно установить бит 0. n ^= toggle
такое же, как n = n^toggle
. n
является эксклюзивным OR. Если мы получим здесь, то бит в n
равен 1, а бит в toggle
равен 1, и мы хотим установить бит в n
равным 0, поэтому эксклюзивный OR изменит этот бит на 0 оставляя каждый другой бит таким же:
else if(bv == 1 && bit == 0)
n ^= toggle;
Это очень четкое объяснение. Мне нужно снова взглянуть на код и попытаться понять его. Спасибо вам всем. –
Почему в методе 'setBitValue (int n, int location, int bit)' нужно снова выполнить getBitValue', и на этот раз используется значение rgb, но длина сообщения. –
@JarekHuang Это именно то, как они его реализовали. Чтобы установить значение бита, этот алгоритм получает текущее значение бита, а затем смотрит на три разных случая: (1) текущее значение бит = желаемое значение, ничего не делать; (2) текущее значение равно 0, желательно = 1; (3) текущее значение равно 1, желательно = 0. Есть способы выполнить это без использования 'getBitValue':' result = (n & ~ toggle) | ((бит == 1)? toggle: 0) ', например. – ajb