2015-02-15 2 views
0

Я пытаюсь понять алгоритм CRC-32. Есть эквивалентное выражение:Есть ли эквивалентное выражение в C для >> 31

y = (X >> 31)^(data >> 7); 

используя &, что-то вроде

y = (x & 0x8000)^(data & 0x800) 
+2

Зачем вам нужно * эквивалентное выражение *? Это похоже на вопрос: существует ли эквивалентный оператор для + – Rizier123

+0

нет, только '<<' and '>>' сдвигайте позиции бит, другие побитовые операторы применяют свою логику битво (побитно) в этой позиции бита, поэтому вы не можете изменить этот бит бит в другой позиции –

+2

, если 'X' является' uint32', тогда 'X >> 31' эквивалентно' !! (x & 0x80000000) ' –

ответ

3

Ну это зависит от ваших расчетов, но в битовых операциях каждый оператор имеет свой собственный мотив, чтобы делать вещи. Тот же ответ может быть получен различными операциями, но это не означает, что оператор эквивалентен друг другу. У каждого оператора есть разные мотивы для достижения.

bit a bit b a & b (a AND b)  a | b (a OR b) a^b (a XOR b) 
    0  0   0    0     0 
    0  1   0    1     1 
    1  0   0    1     1 
    1  1   1    1     0 

Цель < < и >> это дерьмо бит/вывода битов из расчетов

сдвиг вправо

символ правого оператора сдвига >>. Для его работы требуется два операнда. Он сдвигает каждый бит в левом операнде вправо. Число, следующее за оператором, решает количество мест, где бит смещается (т. Е. Правый операнд). Таким образом, делая ch >> 3, все биты будут сдвинуты вправо на три места и так далее.

i = 14; // Bit pattern 1110 
j = i >> 1; // bit pattern shifted 1 thus we get 111 = 7 = 14/2 

левый сдвиг

Символ левого оператора сдвига является < <. Он сдвигает каждый бит в левом операнде слева на количество позиций, обозначенных правым операндом. Он работает против действия оператора правого сдвига. Таким образом, делая ch < < 1 в приведенном выше примере мы имеем 11001010. Пропущенные пробелы заполняются нулями, как указано выше.

левого сдвиг может быть использован для умножения целого числа в упаковке 2, как в:

int i = 4; /* bit pattern equivalent is 100 */ 
int j = i << 2; /* makes it 10000, original number by 4 i.e. 16 */