@iamFake

Bit shift (swap bytes) как это в действительности работает?

Здравствуйте.

Как то я поплыл со сдвигами битов. Задача - поменять порядок байтов в int

unsigned int econv(unsigned int from) {
    unsigned int value = from;
    std::cout << std::hex << "original: " << from << " : " << sizeof(value) << std::endl;

    value |= (from & 0xFF000000) >> 24;
// выделяю из оригинала первый байт, сдвигаю в конец и через "ИЛИ" применяю изменения
    std::cout << from << " >> 24 " << value << std::endl;
    value |= (from & 0x00FF0000) >> 8;
// выделяю второй байт и сдвигаю его на место 3го
    std::cout << from << " >> 8  " << value << std::endl;
    value |= (from & 0x0000FF00) << 8;
// если со сдвигом в право все окей, то со сдвигом в лево проблемы - value не изменяется тут вообще, я что-то не так делаю?
    std::cout << from << " << 8  " << value << std::endl;
    value |= (from & 0x000000FF) << 24;
// правый сдвиг последнего байта на позицию 1го тоже не отражается в результате
    std::cout << from << " << 24 " << value << std::endl;

    return value;
}


Все сдвиги в право не отражаются на результате и я в упор понять не могу где именно я "поплыл"? Может я не правильно понимают суть сдвигов?

Вроде через "битовое И" правильно выделяю байты, потом сдвигаю в нужную позицию и применяю к результату через "битовое ИЛИ"...
  • Вопрос задан
  • 820 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Банально сначала надо unsigned value = 0;
Вы вроде делаете полный порядок, но начальное присваивание неверное.

UPD. Проверил в деле — так и есть.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы