Как поменять местами в C? - PullRequest
2 голосов
/ 13 декабря 2011

Как поменять позиции nybble-битов числа?

Например: 534, преобразовать его в двоичный, 4 самых правых бита нужно поменять местами с 4 самыми левыми, а затем сделать новое число счто.

Кто-нибудь знает, как это сделать?

Ответы [ 4 ]

5 голосов
/ 13 декабря 2011

Руководство по шитанию битов Шона Андерсона имеет следующее:

// swap nibbles ... 
v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);

под записью для Инвертируйте N-битное количество параллельно в 5 * lg (N) операциях.

4 голосов
/ 05 февраля 2014

1)

y = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0);

2)

unsigned char swap_nibbles(unsigned char c)
{
     unsigned char temp1, temp2;

     temp1 = c & 0x0F;
     temp2 = c & 0xF0;
     temp1=temp1 << 4;
     temp2=temp2 >> 4;

     return(temp2|temp1); //adding the bits
}

3)

unsigned char nibbleSwap(unsigned char a)
{
    return (a<<4) | (a>>4);
}
3 голосов
/ 13 декабря 2011

Начнем с того, что шестнадцатеричный 0xf охватывает ровно четыре бита. В 16-битном числе есть четыре куса. Маски для клевов: 0xf000, 0xf00, 0xf0 и 0xf. Затем начните маскирование, сдвиг и побитовое ИЛИ.

0 голосов
/ 13 декабря 2011

Если своп больше похож на 32-битное преобразование конца, должен работать приведенный ниже API:

uint32 decode_32le(uint8 *p)
{
return ( p[0] | (p[1] << 8) | (p[2] << 16) |(p[3]<<24));
}

* здесь он поменяет местами последовательные ячейки памяти / байты, которые выделены только malloc / calloc, а не массивом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...