Что делают эти побитовые операторы? - PullRequest
0 голосов
/ 27 февраля 2020

Я всегда боролся с побитовыми операторами и их практическим использованием. Я нашел в Интернете пример того, что я делаю в C ++, и мне было интересно, что там происходит.

    for (int i = 0; i < size / 2; ++i)
    {
        queue->push(temp[i] & 0xff);
        queue->push((temp[i] >> 8) & 0xff);
    }

Я примерно знаю, что делают операторы «И» и «Сдвиг», но как которые влияют на временную переменную и результат. Кто-нибудь может помочь понять это?

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Первый оператор, temp[i] & 0xff, извлекает младшие 8 бит, потому что 0xff = 1111 1111.

Второй оператор, (temp[i] >> 8) & 0xff, сначала сдвигает биты в temp [i] вправо на 8 раз, поэтому биты с позиции 8 до позиции 15 теперь будут занимать биты с позиции 0 до позиции 7. А когда вы выполняете битовую обработку с 0xFF, вы получаете новые биты с позиции 0 до позиции 7.

Например -

Скажем, temp[i] = 0x01020304 тогда temp[i] & 0xff = 0x04 и (temp[i] >> 8) & 0xff = 0x03

0 голосов
/ 27 февраля 2020

Мое предложение: научиться любить std::bitset. Это часто пригодится, когда мы играем с битами. Рассмотрим этот код:

#include <bitset>
#include <iostream>

int main() {
    unsigned long x = 12345678;

    std::bitset<32> a{ x} ;
    std::bitset<32> b{ x & 0xff };
    std::bitset<32> c{ (x >> 8) & 0xff };
    std::bitset<32> d{ 0xff };
    std::cout << a  << '\n' << b << '\n' << c << '\n' << d;
}

Его вывод (комментарии добавлены)

00000000101111000110000101001110             // x
00000000000000000000000001001110             // x & 0xff
00000000000000000000000001100001             // (x>>8) & 0xff
00000000000000000000000011111111             // 0xff

Так что здесь происходит ...

0xff является целым числом литерал с 8 младшими битами. Побитовое и & позволяет вам маскировать биты, ie результат имеет те биты, которые установлены в обоих операндах. Оператор сдвига >> сдвигает биты на указанную величину (в нашем случае 8).

Всего ваш код сначала помещает первые 8 битов, а затем следующие 8 битов в очередь.

0 голосов
/ 27 февраля 2020

На переменную temp не влияет ни одна операция. Первая логическая операция изолирует младшие 8 битов временной переменной и помещает их в очередь, вторая операция изолирует следующие 8 битов (числа от 8 до 15) и помещает их в очередь. Эти две операции повторяются по размеру / 2 раза.

...