Java 位循环移位
我目前正在学习逐位运算,我的任务是做4位整数的左旋转 我的4位左旋转代码是Java 位循环移位,java,bitwise-operators,bit,javascript,circular-shift,bit-rotation,Java,Bitwise Operators,Bit,Javascript,Circular Shift,Bit Rotation,我目前正在学习逐位运算,我的任务是做4位整数的左旋转 我的4位左旋转代码是 private static int BITS_IN_INTEGER = 4; private static int leftRotate(int x, int n) { return (x << n) | (x >> (BITS_IN_INTEGER - n)); } private static int BITS_IN_INTEGER=4; 私有静态int leftRotate(int
private static int BITS_IN_INTEGER = 4;
private static int leftRotate(int x, int n) {
return (x << n) | (x >> (BITS_IN_INTEGER - n));
}
private static int BITS_IN_INTEGER=4;
私有静态int leftRotate(int x,int n){
返回(x>(整数中的位-n));
}
我想做一个4位循环移位,在旋转后保持为4位,但似乎无法理解它是如何工作的
示例:左旋转1位后的10(1010)将给我5(0101),但它给我的值为21,这比我的4位多
任何帮助我理解这个问题都将不胜感激 如果我理解正确,你想
- 在整数中用
许多位,而不是32位位\u模拟整数
- 对这样的模拟整数执行旋转
intput x
0000 0000 0000 0000 0000 0000 0000 1100
|____|___, emulated int
result of rotating left by n=2 | |
0000 0000 0000 0000 0000 0000 0011 0011
正如我们所看到的,我们所要做的就是将模拟整数上方的位(即整数中的32-位)设置为零。为此,我们使用逻辑“and”(&
)。我们需要一个掩码,在我们想要设置为零的位上有0
(任何&0
总是0),在我们想要保留的位上有1
(任何&1
总是任何东西)
要生成形式为0…01…1
且整数中有位的掩码
许多1
s,我们可以使用(1(整数中的位-n));
}
如果我理解正确,你想
- 在整数中用
位\u模拟整数
许多位,而不是32位
- 对这样的模拟整数执行旋转
目前,您可以进行旋转,但实际int的高位(不属于模拟int的一部分)最终可能不是0。例如:
intput x
0000 0000 0000 0000 0000 0000 0000 1100
|____|___, emulated int
result of rotating left by n=2 | |
0000 0000 0000 0000 0000 0000 0011 0011
正如我们所看到的,我们所要做的就是将模拟整数上方的位(即整数中的32-位)设置为零。为此,我们使用逻辑“and”(&
)。我们需要一个掩码,在我们想要设置为零的位上有0
(任何&0
总是0),在我们想要保留的位上有1
(任何&1
总是任何东西)
要生成形式为0…01…1
且整数中有位的掩码
许多1
s,我们可以使用(1(整数中的位-n));
}
这是基于上述内容的leftRotate()和rightRotate()的实现(谢谢!)
我需要模拟一个简单的罗盘,在左(逆时针)和右(顺时针)两个方向上旋转90º(不是真正的罗盘,只是一个有趣的问题)
因此,我没有通过存储前面的方向并使用*if/else*或*switch*来搞乱代码,而是想到了一个想法,or当然会更干净、高效、优雅
但是,我在将掩码限制为4位时遇到了同样的问题。多亏了上述解决方案,我才能够做到!;)
因此,假设如下:
- North = 1 = 0001
- West = 2 = 0010
- South = 4 = 0100
- East = 8 = 1000
-北=1=0001
-西=2=0010
-南=4=0100
-东=8=1000
当我需要从北到西旋转90º时,我调用leftRotate(),依此类推,直到我再次到达同一点(北)
反之亦然,如果从北转向->东90º,我称之为右旋转(),然后再次转向南,依此类推
以下是片段,希望对您有所帮助:
const BITS_IN_INTEGER=4;
常量整数掩码=(1>(整数中的位-n));
}
//此功能向右(顺时针)旋转1,8,4,2…1,8,4,2
函数右旋转(x,n){
返回整数_掩码&((x>>n));
}
//让我们旋转:
console.log('---向左(逆时针)旋转1,2,4,8…1,2,4,8…1:')
设值=1;
for(设i=0;i<8;i++){
console.log(值);
值=左旋转(值,1);
}
console.log('--向右(逆时针)旋转1,8,4,2…1,8,4,2…1:')
for(设i=0;i<8;i++){
console.log(值);
值=向右旋转(值,1);
}
这是基于上述内容的leftRotate()和rightRotate()的实现(谢谢!)
我需要模拟一个简单的罗盘,在左(逆时针)和右(顺时针)两个方向上旋转90º(不是真正的罗盘,只是一个有趣的问题)
因此,我没有通过存储前面的方向并使用*if/else*或*switch*来搞乱代码,而是想到了一个想法,or当然会更干净、高效、优雅
但是,我在将掩码限制为4位时遇到了同样的问题。多亏了上述解决方案,我才能够做到!;)
因此,假设如下:
- North = 1 = 0001
- West = 2 = 0010
- South = 4 = 0100
- East = 8 = 1000
-北=1=0001
-西=2=0010
-南=4=0100
-东=8=1000
当我需要从北到西旋转90º时,我调用leftRotate(),依此类推,直到我再次到达同一点(北)
反之亦然,如果从北转向->东90º,我称之为右旋转(),然后再次转向南,依此类推
以下是片段,希望对您有所帮助:
const BITS_IN_INTEGER=4;
常量整数掩码=(1>(整数中的位-n));
}
//此功能向右(顺时针)旋转1,8,4,2…1,8,4,2
函数右旋转(x,n){
返回整数_掩码&((x>>n));
}
//让我们旋转:
console.log('---向左(逆时针)旋转1,2,4,8…1,2,4,8…1:')
设值=1;
for(设i=0;i<8;i++){
console.log(值);
值=左旋转(值,1);
}
console.log('--