Поменять местами - PullRequest
       4

Поменять местами

2 голосов
/ 05 ноября 2019

, так что у меня проблема с "построением нового номера путем изменения его клевов". Вот как выглядит упражнение: Напишите функцию, которая имеет значение unsigned na) и возвращает значение с полубайтами, расположенными в обратном порядке

Я думал, что все 8 полубайтов из 32-битного unsigned должны быть помещены вобратный порядок. Итак, в качестве примера для числа 24, которое равно 00000000000000000000000000011000. => Обратное должно быть: 10000001000000000000000000000000.

#include <stdio.h>

unsigned getNibble(unsigned n,unsigned p){

unsigned mask = 0xFu;
unsigned nibble = 0;

nibble = (n&(mask<<p))>>p;

return nibble;

}


unsigned swapNibbles(unsigned n){
unsigned new = 0;
unsigned nibble;
for(unsigned i=0;i<(sizeof(n)*8);i=i+4){
    nibble = getNibble(n,i);
    new = (new<<i) + nibble;
}

return new;
}


int main(void) {

printf("0x%x",swapNibbles(24));

return 0;
}

Я попытался отладить его, и он шел хорошо до одной точки. При одном из правильных сдвигов он преобразовал мою «новую» переменную в 0.

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

Это утверждение

new = (new << i) + nibble;

неверно. Там должно быть

new = (new << 4) + nibble;
1 голос
/ 05 ноября 2019

Параллельный подход:

uint32_t n = ...;

// Swap the nibbles of each byte.
n = (n & 0x0F0F0F0F ) << 4
  | (n & 0xF0F0F0F0 ) >> 4;

// Swap the bytes of each byte pair.
n = ( n & 0x00FF00FF ) << 8
  | ( n & 0xFF00FF00 ) >> 8;

// Swap the byte pairs.
n = ( n & 0x0000FFFF ) << 16
  | ( n & 0xFFFF0000 ) >> 16;

Параллельное выполнение работы значительно уменьшает количество операций.

          OP's       This     
          Approach   Approach 
--------  ---------  ---------
Shifts     24 /  48    6 /   8    32 bits / 64 bits
Ands        8 /  16    6 /   8
Ors*        8 /  16    3 /   4
Assigns     8 /  16    3 /   4
Adds        8 /  16    0 /   0
Compares    8 /  16    0 /   0
--------  ---------  ---------
Total      64 / 128   18 /  24
--------  ---------  ---------
Scale     O(N)       O(log(N))

* Addition was used as "or" in your solution.
...