java - 位循环移位
问题描述
我目前正在学习按位运算,我的任务是对 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));
}
我想进行 4 位循环移位以在旋转后保持为 4 位,但似乎无法理解它是如何工作的。
示例:左旋转 1 位后的 10 (1010) 会给我 5 (0101) 但它给我的值 21 比我的 4 位多。
任何让我理解这个问题的帮助将不胜感激!
解决方案
如果我理解正确,你想
- 模拟具有
BITS_IN_INTEGER
多位而不是 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
正如我们所看到的,我们所要做的就是将模拟 int 上方的位(即 32 -BITS_IN_INTEGER
高位)设置为零。为此,我们使用逻辑“与” ( &
)。我们需要一个掩码,它包含0
我们想要设置为零的位(任何东西& 0
总是 0)和1
我们想要保留的位(任何东西& 1
总是任何东西)。
0...0 0011 0011 ← the result from before
& 0...0 0000 1111 ← a mask
——————————————————
0...0 0000 0011 ← the masked result where unused bits are 0
要生成0...01...1
具有BITS_IN_INTEGER
许多1
s 形式的掩码,我们可以使用(1 << BITS_IN_INTEGER) - 1
. - 1
转换10000
为01111
. _
static int BITS_IN_INTEGER = 4;
static int INTEGER_MASK = (1 << BITS_IN_INTEGER) - 1;
static int leftRotate(int x, int n) {
return INTEGER_MASK & ((x << n) | (x >>> (BITS_IN_INTEGER - n)));
}
推荐阅读
- python - Boto3 S3 客户端与多线程一起使用时返回奇怪的信息
- reactjs - 在 react js 中创建产品过滤器
- css - 更新验证错误时如何使用 react-hook-form 手动重新渲染组件
- java - Hyperledger Fabric:使用 Fabric Gateway Java SDK 的 TLS 内部错误
- mysql - MYSQL - 如何使用约束限制某些值?
- c# - Ajax ActionLink 在 action 和 routeValues 之间附加斜线
- javascript - 如何在下一个 js 中使用亚马逊 SES 发送电子邮件?
- c# - 在 selenium C# 中启动 Electron 应用程序后没有与 Driver 建立连接,代码如下
- openshift - Openshift 卷挂载权限错误
- javascript - 仅禁用日历模式