Я пытаюсь понять алгоритм CRC-32. Есть эквивалентное выражение:Есть ли эквивалентное выражение в C для >> 31
y = (X >> 31)^(data >> 7);
используя &
, что-то вроде
y = (x & 0x8000)^(data & 0x800)
Я пытаюсь понять алгоритм CRC-32. Есть эквивалентное выражение:Есть ли эквивалентное выражение в C для >> 31
y = (X >> 31)^(data >> 7);
используя &
, что-то вроде
y = (x & 0x8000)^(data & 0x800)
Ну это зависит от ваших расчетов, но в битовых операциях каждый оператор имеет свой собственный мотив, чтобы делать вещи. Тот же ответ может быть получен различными операциями, но это не означает, что оператор эквивалентен друг другу. У каждого оператора есть разные мотивы для достижения.
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 */
Зачем вам нужно * эквивалентное выражение *? Это похоже на вопрос: существует ли эквивалентный оператор для + – Rizier123
нет, только '<<' and '>>' сдвигайте позиции бит, другие побитовые операторы применяют свою логику битво (побитно) в этой позиции бита, поэтому вы не можете изменить этот бит бит в другой позиции –
, если 'X' является' uint32', тогда 'X >> 31' эквивалентно' !! (x & 0x80000000) ' –