Обращение битов по битам - PullRequest
5 голосов
/ 25 марта 2010

Я пытаюсь сделать инверсию битов в байте. Я использую код ниже

static int BitReversal(int n)
{
    int u0 = 0x55555555; // 01010101010101010101010101010101
    int u1 = 0x33333333; // 00110011001100110011001100110011
    int u2 = 0x0F0F0F0F; // 00001111000011110000111100001111
    int u3 = 0x00FF00FF; // 00000000111111110000000011111111
    int u4 = 0x0000FFFF;
    int x, y, z;
    x = n;
    y = (x >> 1) & u0;
    z = (x & u0) << 1;
    x = y | z;

    y = (x >> 2) & u1;
    z = (x & u1) << 2;
    x = y | z;

    y = (x >> 4) & u2;
    z = (x & u2) << 4;
    x = y | z;

    y = (x >> 8) & u3;
    z = (x & u3) << 8;
    x = y | z;

    y = (x >> 16) & u4;
    z = (x & u4) << 16;
    x = y | z;

    return x;
}

Он может обратить бит (на 32-битной машине), но есть проблема, Например, ввод 10001111101, я хочу получить 10111110001, но этот метод перевернет весь байт, включая заголовок 0s. Выход 10111110001000000000000000000000. Есть ли какой-нибудь способ только изменить реальное число? Я не хочу конвертировать его в строку и реверс, а затем снова конвертировать. Есть ли чистый математический метод или метод битовой операции?

С наилучшими пожеланиями,

Ответы [ 5 ]

4 голосов
/ 25 марта 2010

Получите наибольшее число бит, используя аналогичный подход, и сдвиньте полученные биты вправо 33 - # бит и вуаля!

1 голос
/ 25 марта 2010

Дрянной путь - сдвиг, пока вы не получите 1 справа:

if (x != 0) {
    while ((x & 1) == 0) {
        x >>= 1;
    }
}

Примечание: Вы должны переключить все переменные на unsigned int. Как написано, у вас может быть нежелательное расширение знака в любое время, когда вы меняете вправо.

0 голосов
/ 28 марта 2010

Попробуйте использовать Integer.reverse (int x);

0 голосов
/ 25 марта 2010

Предполагается, что все 32 бита значимы и полностью изменяют ситуацию.Вы МОЖЕТЕ попытаться угадать количество значащих бит, найдя старшую 1, но это не обязательно точно, поэтому я бы предложил вам изменить функцию, чтобы она принимала второй параметр, указывающий количество значащих бит.Затем, перевернув биты, просто сдвиньте их вправо.

0 голосов
/ 25 марта 2010

Один из методов может заключаться в том, чтобы найти старшее число битов знака в числе n, сдвинуть влево n на это число, а затем выполнить его по указанному выше алгоритму.

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