我有使用Java的这种行为:
int b=16;
System.out.println(b<<30);
System.out.println(b<<31);
System.out.println(b<<32);
System.out.println(b<<33);
输出:0 0 16 32
Java移位是循环的吗?如果不是,为什么当b << 30时我得到0,而当b << 32时我得到16?
移位不是循环的;对于int
s 移位,Java仅使用5个最低有效位,因此(b << 0)
等效于(b << 32)
(等效于(b << 64)
等)。您可以简单地求出移位量,然后除以32的余数。
移位long
s 也会发生类似的情况,其中Java仅使用6个最低有效位,因此(aLong << 0)
等效于(aLong << 64)
。
JLS的第15.19节谈到了这一点:
如果左侧操作数的提升类型为int,则 仅 将右侧操作数的 最低5位
用作移位距离。就像右侧操作数受到掩码值0x1f(0b11111)的按位逻辑AND运算符&(§15.22.1)一样。因此,实际使用的移动距离始终在0到31(含)范围内。如果左侧操作数的提升类型很长,则 仅 将右侧操作数 的六个最低位
用作移位距离。就像右侧操作数受到掩码值0x3f(0b111111)的按位逻辑AND运算符&(§15.22.1)一样。因此,实际使用的移动距离始终在0到63之间(包括0和63)。
(强调我的)
(你不能位移位float
S或double
S,并试图位移short
或byte
将受到价值 一元数值提升 到一个int
反正。)
您0
来自16 << 30
,因为1位来自16
00000000 00000000 00000000 00010000
从的结尾移开int
并被丢弃。
// Discarded - Result-----------------------------
(00000100) 00000000 00000000 00000000 00000000
我目前正在学习位操作,我的任务是做一个左旋转的4位整数。 我的4位左旋转代码是 我想做一个4位循环移位,以保持作为一个4位后旋转,但似乎不能理解它是如何工作的。 例如:10(1010)左旋转1位后给出5(0101),但它给出的值是21,比我的4位多。 任何能让我理解这个问题的帮助都将不胜感激!
我必须编写一个函数,对y位置的位进行左循环移位。例如,如果我将:01011000和2作为y,则函数必须返回011000001。 我已经尝试使用但它似乎是无用的。
问题内容: 我想知道如何实现由位表示的位串的k 循环 右移。 这些代码所做的全部是 返回0 ,如何使其循环移位? 问题答案: 这应该工作: 另请参阅Wikipedia上有关循环移位的文章。
4、循环移位指令 循环移位指令有:循环左移ROL(Rotate Left)和循环右移ROR(Rotate Right)。 指令的格式:ROL/ROR Reg/Mem, CL/Imm 受影响的标志位:CF和OF 循环左移/右移指令只是移位方向不同,它们移出的位不仅要进入CF,而且还要填补空出的位。具体功能如下图(a)、(b)所示。 (a)、ROL (b)、ROR 下面是几个循环移位的例子及其执行结果
5、带进位的循环移位指令 带进位的循环移位指令有:带进位的循环左移RCL(Rotate Left Through Carry)和带进位的循环右移RCR(Rotate Right)。 指令的格式:RCL/RCR Reg/Mem, CL/Imm 受影响的标志位:CF和OF 带进位的循环左移/右移指令只有移位的方向不同,它们都用原CF的值填补空出的位,移出的位再进入CF。具体功能如下图(a)、(b)所示
本文向大家介绍python实现整数的二进制循环移位,包括了python实现整数的二进制循环移位的使用技巧和注意事项,需要的朋友参考一下 题目:如何在python中实现整数的二进制循环移位? 概述 在python中,可以通过<<以及>>运算符实现二进制的左移位以及右移位,然而并没有实现循环移位的运算符,暂时也找不到可以实现循环移位的函数,所以在本文中,主要介绍了如何使用字符的切片运算实现循环位移。