Обменять разные биты между двумя целыми числами - C - PullRequest
0 голосов
/ 07 сентября 2018

мне нужна помощь.

Мне нужно решить эту проблему перестановки 2 разных битов между 2 разными целыми числами.

Examlpe (бит свопа 3 из (101) с битом 2 из (100))

приведет к (001) & (110)

Моё испытание

void swap(unsigned int numberA, unsigned int numberB, int bitPositionA, int bitPositionB)
{
    unsigned int aShift = 1 << bitPositionA, bShift = 1 << bitPositionB;
    unsigned int bitA = numberA & aShift;
    unsigned int bitB = numberB & bShift;


    numberB &= ~bShift; // Set the bit to `0`
    numberB |= bitA;    // Set to the actual bit value

    numberA &= ~aShift; // Set the bit to `0`
    numberA |= bitB;    // Set to the actual bit value

    printf("Number[1] => %d Number => %d",numberA,numberB);
}

Неверный вывод swap(5,4,3,2) -> Number[1] => 5 Number => 0

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018
void swap(unsigned int numberA, unsigned int numberB, int bitPositionA, int bitPositionB)
{
    unsigned int aShift = 1 << bitPositionA-1, bShift = 1 << bitPositionB-1;
    unsigned int bitA = numberA & aShift;
    unsigned int bitB = numberB & bShift;


    numberB &= ~bShift; // Set the bit to `0`
    numberB |= bitA >> (bitPositionB-1);    // Set to the actual bit value

    numberA &= ~aShift; // Set the bit to `0`
    numberA |= bitB >> (bitPositionA-1);    // Set to the actual bit value

    printf("Number[1] => %02X Number => %02X \n",numberA,numberB);
}
0 голосов
/ 07 сентября 2018
  1. Вы забываете, что биты, как и массивы, нумеруются начиная с ноль , а не один .

    Замените ваш звонок на swap на:

    swap(5, 4, 2, 1);
    
  2. Код, который OR в новых битах не перемещает их в битовую позицию, в которую они должны войти в новый номер. Они остаются в том месте, где их вытащили в номере источника.

    numberB &= ~bShift; // Set the bit to `0`
    if(bitA)
        bitA = 1 << bitPositionB;
    numberB |= bitA;    // Set to the actual bit value
    
    numberA &= ~aShift; // Set the bit to `0`
    if(bitB)
        bitB = 1 << bitPositionA;
    numberA |= bitB;    // Set to the actual bit value
    
...