Java - круговой сдвиг с использованием побитовых операций - PullRequest
26 голосов
/ 30 апреля 2011

Мне интересно, как реализовать круговой сдвиг вправо на k цепочки битов, представленной int битами.

public int rtCircShift(int bits, int k)
{
    return bits >> k;
}

Все, что делает этот код, это return 0 , как мне сделать это круговым сдвигом?

Ответы [ 5 ]

35 голосов
/ 30 апреля 2011

Вы имеете в виду, что вы хотите, чтобы биты, повернутые с правой стороны, появлялись слева?

return Integer.rotateRight(bits, k);

Пример:

int n = 0x55005500; // Binary 01010101000000000101010100000000
int k = 13;
System.err.printf("%08x%n", Integer.rotateRight(n, k));

Выход:

a802a802 // Binary 10101000000000101010100000000010
32 голосов
/ 30 апреля 2011

Это должно работать:

 return (bits >>> k) | (bits << (Integer.SIZE - k));

Также см. Статью Википедии о круговых сдвигах .

8 голосов
/ 02 декабря 2012

Ответ от schnaader правильный:

return (bits >>> k) | (bits << (32-k));
  1. первая часть (bits >>> k) смещает вправо значение, хранящееся в bits на k бит, а «третий >» гарантирует, что крайний левый бит равен нулю вместо знака bits
  2. вторая часть (bits << (32-k)) - сдвиг влево значения в bits на k -комплектное число битов

Теперь у вас есть две временные переменные, в которых первые (32-k) биты хранятся в самых правых битах var (1), а последние k битов хранятся в самых левых битах var (2). Битовая операция или операция просто объединяет эти две временные переменные (обратите внимание на использование >>> вместо >>), и вы получаете круговое смещение.

1 голос
/ 02 декабря 2016

Это должно сделать это:

/**
 * Rotate v right with k steps
 */
public static int rro(int v, int k) {
    return (v >>> (k%32)) | (v << ((k%32)-32)
}

/**
 * Rotate v left with k steps
 */
public static int lro(int v, int k) {
    return (v << (k%32)) | (v >>> ((k%32)-32)
}

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

0 голосов
/ 23 декабря 2014
int x=12345,n=5;
System.out.println((x%10)*Math.pow(10, n-1)+(x/10));

Для сдвига на один бит.

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