развернуть байт (изменение порядка следования бит)

ustas
Offline
Зарегистрирован: 12.03.2012

как можно быстро "развернуть" байт?

к примеру, есть B11000000 - как сделать из него B00000011 (т.е. чтобы самый младший бит стал самым старшим, а самый младший - самым старшим)?

__Alexander
Offline
Зарегистрирован: 24.10.2012

Если скорость пофиг, то можно циклом. Если быстро, то уже давно есть такой способ.

 

x = ((x & 0x55) << 1) | ((x & 0xAA) >> 1);
x = ((x & 0xCC) >> 2) | ((x & 0x33) << 2);
x = (x >> 4) | (x << 4);

tsostik
Offline
Зарегистрирован: 28.02.2013

В общем случае - простым циклом
 

byte orig;
byte result=0;
...
for(bit = 0; bit < 8; bit++) {
    result+= ((orig >> bit) & 1 ) << bit;
}

В частном случае, напрммер при передаче по SPI может оказаться, что это вовсе не нужно, а нужно лишь установить параметр MSBFIRST/LSBFIRST.

ustas
Offline
Зарегистрирован: 12.03.2012

ой.. посыпаю голову пеплом.. задачка стояла как раз при работе через SPI

функцию SPI.setBitOrder() проглядел...

slider
Offline
Зарегистрирован: 17.06.2014

__Alexander пишет:

Если скорость пофиг, то можно циклом. Если быстро, то уже давно есть такой способ.

 

x = ((x & 0x55) << 1) | ((x & 0xAA) >> 1);
x = ((x & 0xCC) >> 2) | ((x & 0x33) << 2);
x = (x >> 4) | (x << 4);

у меня не заработал на нем скетч. 

помогла только такая комбанация найденная в сети

   x = (x & 0x55) << 1 | (x & 0xAA) >> 1;
   x = (x & 0x33) << 2 | (x & 0xCC) >> 2;
   x = (x & 0x0F) << 4 | (x & 0xF0) >> 4; 
 
Генри Уоррен  "Алгоритмические трюки для программистов"
 
__Alexander
Offline
Зарегистрирован: 24.10.2012

и в чем разница, кроме как в &0x0F ?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

при условии, что х - восьми разрядный оба способа должны дать одинаковый результат.

__Alexander
Offline
Зарегистрирован: 24.10.2012

отож.

или у кого-то  байт не восьмиразрядный?