Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 位循环移位_Java_Bitwise Operators_Bit_Javascript_Circular Shift_Bit Rotation - Fatal编程技术网

Java 位循环移位

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

我目前正在学习逐位运算,我的任务是做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 x,int n){
返回(x>(整数中的位-n));
}
我想做一个4位循环移位,在旋转后保持为4位,但似乎无法理解它是如何工作的

示例:左旋转1位后的10(1010)将给我5(0101),但它给我的值为21,这比我的4位多


任何帮助我理解这个问题都将不胜感激

如果我理解正确,你想

  • 在整数中用
    位\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));
}

如果我理解正确,你想

  • 在整数中用
    位\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('--