2016-10-18 5 views
0
  • reverseBytes - обратный байтов
  • Пример: reverseBytes (0xabcdef) = 0xefcdab8967452301
  • Юридические ОПС: ~ &^| + < < >>

Я должен решить вышеуказанную проблему. Нет никакого ограничения на нет. операторов. У меня уже есть другое решение. Но я хотел бы знать, в чем проблема со следующим решением, с которым я столкнулся? Спасибо.reverseBytes с использованием Битовые операторы

long reverseBytes(long x) { 
    int a = x; //Get first bytes, first 8 bits 
    int b = (a >> 8); //Get 2nd byte 
    int c = (b >> 8); //3rd byte 
    int d = (c >> 8); //4th 
    int e = (d >> 8); //5th 
    int f = (e >> 8); //6th 
    int g = (f >> 8); //7th 
    int h = (g >> 8); //8th 
    a = a & 0xFF; //Remove the rest except LSB byte 
    b = b & 0xFF; // same 
    c = c & 0xFF; 
    d = d & 0xFF; 
    e = e & 0xFF; 
    f = f & 0xFF; 
    g = g & 0xFF; 
    h = h & 0xFF; 
    return ((a << 56) + (b << 48) + (c << 40) + (d << 32) + (e << 24) + (f << 16) + (g << 8) + (h)); 
} 
+0

Вы пытались запустить ваш решения и выяснить, что не так? – Marco

+0

Конечно. Я бы не знал, что это было неправильно, если бы я не пробовал. Я просто извлекал каждый байт в целое число. Затем суммировали их после перехода на свое конкретное положение. Последний байт (LSB) становится первым (MSB) ... и так далее. –

+0

То, как вы извлекаете байты, уже не работает (и не должно использоваться, слишком серийно), поскольку оно полагается на весь набор 'long' в' int' – harold

ответ

0
  1. Для практического применения, вы можете использовать функции библиотеки bswap64()
  2. Для студенческой практики, вам нужно написать простой цикл, как:

    unsigned long reverseBytes(unsigned long x) { 
        unsigned long rc; 
        for(int i = 0; i < 8; i++, x >>= 8) 
        rc = (rc << 8) | (unsigned char)x; 
        return rc; 
    } 
    

 Смежные вопросы

  • Нет связанных вопросов^_^