@Xiorcid

Как поменять порядок битов в байте C?

Есть байт, например 00101101, его необходимо превратить в 10110100.
Как это сделать?
  • Вопрос задан
  • 465 просмотров
Пригласить эксперта
Ответы на вопрос 4
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Вручную, наивно. Представьте, что это массив из 8 значений. У вас есть операции "прочитать i-ое значение" ((x >> i) & 1) и "записать значение a в позицию i" ((x & ~(1 << i)) | (a << i)). Дальше остается написать цикл и руками менять биты местами.

Дальше, конечно, можно извращаться с оптимизацией и всякмими битовыми хитростями.

Но если вам важна именно скорость, то быстрее предподсчета (как вам угодно) и хранения результата в таблице вы ничего не сделаете.
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как поменять порядок битов в байте C?

Посмотреть какой бит стоит на каждом месте и поставить такой же на каждом новом месте?
Можно обойтись без сдвигов. Удобно пользоваться битовыми операциями, но можно обойтись и без них. Это можно сделать одной чистой арифметикой. Для ускорения можно анализировать не отдельные биты а группы -- например по 2 или по 4 и выполнять для них замену по таблице.
Ответ написан
Комментировать
vabka
@vabka
Токсичный шарпист
Только при помощи битовых масок и сдвигов, если в ассемблер не упарываться:
int8_t byte = 0xAA; // 0b10101010
int8_t result = 0;
result = result | ((0x80 & byte) >> 7);
result = result | ((0x40 & byte) >> 5);
result = result | ((0x20 & byte) >> 3);
result = result | ((0x10 & byte) >> 1);
result = result | ((0x08 & byte) << 1);
result = result | ((0x04 & byte) << 3);
result = result | ((0x02 & byte) << 5);
result = result | ((0x01 & byte) << 7);
// result = 0b01010101
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Тут все биты - перевернуты.
На псевдокоде как-то так.
int a = 0b0010_1101;
for(i in (1..8)) {
 b |= a & 0b0000_0001
 b <<= 1;
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы