当前位置: 首页 > 知识库问答 >
问题:

左循环位移位

马欣荣
2023-03-14

我必须编写一个函数,对y位置的位进行左循环移位。例如,如果我将:01011000和2作为y,则函数必须返回011000001。

我已经尝试使用我nteger.rotate左()但它似乎是无用的。

共有1个答案

俞飞鸣
2023-03-14

我认为这应该行得通:

int rotate_8bits_left(int val, int y) {
    // amend y to the range [0, 7] with this:
    // y = ((y % 8) + 8) % 8;
    // or better, with this:
    y = y & 0x7;
    // do the rotation
    return ((val << y) & 0xFF) | (val >> (8-y));
}

让我们解释一下不同的部分:

// move val left y bits:
(val << y)

然而,上面保留了超出第8位的位,因此我们需要截断它们,因此我们使用:

// move val left y bits and truncate anything beyond the 8th bit:
(val << y) & 0xFF

现在,我们需要在开始时添加已传出的位。我们可以通过向右移动来计算向左移动的位:

// move to the right, 8-y bits
val >> (8-y)

如果我们现在将这两个部分粘合在一起,我们将得到旋转:

int new_val = ((val << y) & 0xFF) | (val >> (8-y));

现在对于第一部分,我们要处理可能不在范围[0,8]内的y。在使用之前,我们可以通过以下方式将y修正到此范围:

y = ((y % 8) + 8) % 8;

上面的表达式固定了y的负值和正值,如果y为负值,则模将返回范围[-7,-1]内的负值,然后加上8,我们返回到正值范围。我们必须再做一次模运算,对于y为正的情况,加上8来修正负的情况,使其回到8以上。第二个模解决了这个问题。

但我们可以用一种更简单的方法对y进行同样的修正,只保留范围[0,7]中遇到的前3位,将8视为0,这可以通过以下表达式实现,该表达式适用于y的负值和正值:

y = y & 0x7;
 类似资料:
  • 我目前正在学习位操作,我的任务是做一个左旋转的4位整数。 我的4位左旋转代码是 我想做一个4位循环移位,以保持作为一个4位后旋转,但似乎不能理解它是如何工作的。 例如:10(1010)左旋转1位后给出5(0101),但它给出的值是21,比我的4位多。 任何能让我理解这个问题的帮助都将不胜感激!

  • 4、循环移位指令 循环移位指令有:循环左移ROL(Rotate Left)和循环右移ROR(Rotate Right)。 指令的格式:ROL/ROR Reg/Mem, CL/Imm 受影响的标志位:CF和OF 循环左移/右移指令只是移位方向不同,它们移出的位不仅要进入CF,而且还要填补空出的位。具体功能如下图(a)、(b)所示。 (a)、ROL (b)、ROR 下面是几个循环移位的例子及其执行结果

  • 问题内容: 我有使用Java的这种行为: 输出:0 0 16 32 Java移位是循环的吗?如果不是,为什么当b << 30时我得到0,而当b << 32时我得到16? 问题答案: 移位不是循环的;对于s 移位,Java仅使用5个最低有效位,因此等效于(等效于等)。您可以简单地求出移位量,然后除以32的余数。 移位s 也会发生类似的情况,其中Java仅使用6个最低有效位,因此等效于。 JLS的第1

  • 5、带进位的循环移位指令 带进位的循环移位指令有:带进位的循环左移RCL(Rotate Left Through Carry)和带进位的循环右移RCR(Rotate Right)。 指令的格式:RCL/RCR Reg/Mem, CL/Imm 受影响的标志位:CF和OF 带进位的循环左移/右移指令只有移位的方向不同,它们都用原CF的值填补空出的位,移出的位再进入CF。具体功能如下图(a)、(b)所示

  • 问题内容: 我想知道如何实现由位表示的位串的k 循环 右移。 这些代码所做的全部是 返回0 ,如何使其循环移位? 问题答案: 这应该工作: 另请参阅Wikipedia上有关循环移位的文章。

  • 今天我学习了左移位运算符()。正如我所理解的,左移位运算符将位移动到指定的左边。我也知道乘以2表示移位。但是我很困惑,比如“移位”到底是什么意思,为什么当赋值的类型不同时,输出会有所不同? 当我调用下面的函数时,它给出的输出为