Ответ 1
Это должно работать:
return (bits >>> k) | (bits << (Integer.SIZE - k));
Также см. статью Википедии о циклических сменах.
Мне интересно, как реализовать правый сдвиг круглый по k битовой строки, представленной битами int
.
public int rtCircShift(int bits, int k)
{
return bits >> k;
}
Все, что делает этот код, - это возврат 0, как я могу сделать его круговым сдвигом?
Это должно работать:
return (bits >>> k) | (bits << (Integer.SIZE - k));
Также см. статью Википедии о циклических сменах.
Вы хотите, чтобы бит, повернутый с правой стороны, появился слева?
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
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 вместе (обратите внимание на использование >>>
вместо >>
), и у вас есть круговой сдвиг.
int x=12345,n=5;
System.out.println((x%10)*Math.pow(10, n-1)+(x/10));
Переход на один бит.
Это должно сделать это:
/**
* 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" во всех местах.