2014-01-24 5 views
0

Вопрос основан на этом site.Получение/установка битового значения из изображения

Может кто-нибудь объяснить смысл этих строк:

private int getBitValue(int n, int location) { 
     int v = n & (int) Math.round(Math.pow(2, location)); 
     return v==0?0:1; 
} 

и

private int setBitValue(int n, int location, int bit) { 
    int toggle = (int) Math.pow(2, location), bv = getBitValue(n, location); 
    if(bv == bit) 
     return n; 
    if(bv == 0 && bit == 1) 
     n |= toggle; 
    else if(bv == 1 && bit == 0) 
     n ^= toggle; 
    return n; 
} 

ответ

2
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; 
+0

Это очень четкое объяснение. Мне нужно снова взглянуть на код и попытаться понять его. Спасибо вам всем. –

+0

Почему в методе 'setBitValue (int n, int location, int bit)' нужно снова выполнить getBitValue', и на этот раз используется значение rgb, но длина сообщения. –

+1

@JarekHuang Это именно то, как они его реализовали. Чтобы установить значение бита, этот алгоритм получает текущее значение бита, а затем смотрит на три разных случая: (1) текущее значение бит = желаемое значение, ничего не делать; (2) текущее значение равно 0, желательно = 1; (3) текущее значение равно 1, желательно = 0. Есть способы выполнить это без использования 'getBitValue':' result = (n & ~ toggle) | ((бит == 1)? toggle: 0) ', например. – ajb

1

getBitValue просто получает значение указанного бита (на определенном месте)

setBitValue задает значение бит в соответствующем конкретном месте.

Эти методы геттера/сеттера обычно используются для обработки изображений, то есть если у вас есть мускус, и вы хотите изменить конкретное значение бита.

Ничего более-менее.

+0

Извините, если не указать.я хотел бы знать значение каждой строки в этих двух методах и почему 'setBitValue (int n, int location, int bit)' нужно делать 'getBitValue (n, location);' снова. –