Обмен байтов - PullRequest
       2

Обмен байтов

2 голосов
/ 02 сентября 2011

Я хочу обменять байты числа.Пример двоичного представления числа: 00000001 00011000 00000100 00001110.Я хочу изменить это: 00001110 00000100 00011000 00000001.

Можете ли вы помочь?Текущий код ниже:

void showBits(int n)
{
    int i,k,andMask;
    for(i=15;i>=0;i--)
    {
        andMask=1<<i;
        k=n&andMask;
        k==0?(cout<<"0"):(cout<<"1");
    }
}
int reverse(int a)
{
    int b=a<<8;
    int c=a>>8;
    return (b|c);
}
int main()
{
    int a=10;
    showBits(a);
    int b=reverse(a);
    showBits(b);
    cin.get();
} 

Ответы [ 4 ]

3 голосов
/ 02 сентября 2011

Если вы хотите просто инвертировать 32-битное число, вы можете использовать метод сдвига битов, который изолирует каждую область байтов с помощью битовых масок и логических AND, а затем меняет эти байты на соответствующее количество сдвинутых битов. используя операторы сдвига битов >> и <<. Затем вы можете рекомбинировать биты, используя логический OR следующим образом:

int temp = 0x12345678;
temp = ((0xFF & temp) << 24) | ((0xFF00 & temp) << 8) | ((0xFF0000 & temp) >> 8) |
       ((0xFF000000 & temp) >> 24));

Теперь вы получите окончательное значение в temp из 0x78563412.

Обновление: Хорошо, я просматриваю ваш код и отмечаю следующее:

  1. Размер int кажется, что вы хотите работать с бинарной цифрой, которую вы разместили, 32-битной ... так что ваша функция showBits не циклически перебирает достаточное количество бит для отображения всего 32 -битное целое число Насколько я могу видеть прямо сейчас, он будет отображаться только до 16 младших битов. Поэтому вам необходимо четко определить, работаете ли вы на платформе, которая определяет int как 16 или 32-бит.
  2. Ваши reverse функции неверны. Если у вас есть 32-битный int, такой как 0x12345678, и вы сдвигаете его влево на 8 бит, вы получите 0x34567800. Точно так же, когда вы сдвинете его вправо на 8 бит, вы просто получите 0x00123456. Сдвиг числа не приводит к повороту значений на их соответствующие позиции (то есть сдвиг влево на 8 битов не даст вам 0x34567812). Кроме того, даже если это произойдет, логическое OR повернутых значений все равно не будет правильным изменением значений. Вместо этого вы должны использовать метод, описанный выше, который использует битовые маски и логический AND, чтобы изолировать каждый байт, а затем сдвинуть эти биты на соответствующее количество мест, чтобы обратить биты в 32-битное слово.
2 голосов
/ 02 сентября 2011
int myInt = 0x012345678

__asm {
  mov eax, myInt
  bswap eax
  mov myInt, eax
}
2 голосов
/ 02 сентября 2011

Примерно так должно работать:

result = ((number & 0xFF) << 24) | ((number & 0xFF00) << 8) | 
   ((number & 0xFF0000) >> 8) | ((number & 0xFF000000) >> 24);
0 голосов
/ 02 сентября 2011

Если ваша первоначальная задача по преобразованию из машинно-специфического порядка байтов в обратный порядок байтов и обратно, взгляните на функции hton * и ntoh *.

http://minix1.woodhull.com/manpages/man3/hton.3.html

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