Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Возможно ли инвертировать порядок бит в байте?

#битовые_операции #c #cpp


Т.е. можно ли средствами C++ из 1100 0000 превратить в 0000 0011 ? Какие для этого
нужно использовать методы?    


Ответы

Ответ 1



Как известно, байт - это восьмиразрядное двоичное число. Стало быть, его можно представить в виде такого многочлена: b1 * 2^7 + b2 * 2^6 + ... + b7 * 2^1 + b8 * 2^0 ну или 128 * b1 + 64 * b2 + ... + 2 * b7 + 1 * b8 где b1 - b8 - биты в байте. Следовательно, получить байт "задом наперёд" можно так: unsigned char Invert(unsigned char x) { int base = 256; unsigned char res = 0; while (x != 0) { res += (x & 1) * (base >>= 1); x >>= 1; } return res; }

Ответ 2



Вот средство языка (циклы и битовые операции) int main() { int a,b; a = 0xC0; for(int i = 0; i < 8; i++) { b = b<<1; b += a%2; a = a>>1; } return 0; }

Ответ 3



template const T reversebits(const T& in) { T out = T(0); for (size_t i = 0; i < sizeof(T) * 8; ++i) { out <<= 1; out |= (in >> i)&1; } return out; }

Ответ 4



Бит-реверсивная перестановка используется в алгоритме FFT (быстрое дискретное преобразование Фурье) для 2^n точек. Простейший способ реализации - табличный (256 байтов). Но можно применить и стратегию дублирования, при которой на первом шаге попарно переставляются соседние тетрады, на втором - диады и на третьем - биты: abcdefgh - efghabcd - ghefcdab - hgfedcba. Возможна такая реализация (на месте), допускающая использование макросов: b = ((b >> 4) & 15) | ((b & 15) << 4); b = ((b >> 2) & 51) | ((b & 51) << 2); b = ((b >> 1) & 85) | ((b & 85) << 1); Имеется в виду, что 15=0b00001111, 51=0b00110011, 85=0b01010101.

Ответ 5



#define INVERT_BYTE(a) ((a&1)<<7) | ((a&2)<<5) | ((a&4)<<3) | ((a&8)<<1) | ((a&16)>>1) | ((a&32)>>3) | ((a&64)>>5) | ((a&128)>>7)

Комментариев нет:

Отправить комментарий