Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 2

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

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

Ответ 3

Ответ schnaader верен:

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

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

Ответ 4

int x=12345,n=5;
System.out.println((x%10)*Math.pow(10, n-1)+(x/10));

Переход на один бит.

Ответ 5

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

/**
 * 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" во всех местах.