在java中使用右移操作符时,我遇到了一种奇怪的情况。当我右移16到31,结果是0,然而,当我试图在32的时候右移16,它本身仍然是16。有人能解释一下吗?因为我要疯了。
public class RightShiftTest {
public static void main(String args[]) {
int b = 16;
System.out.println("Bit pattern for int " + b + " is " +Integer.toBinaryString(b));
下面是我创建的用于修改现有日历事件的脚本。我的目标是更改描述,使其从注册按钮更改为注册关闭。该脚本的工作原理是它将添加来宾,但是当超过最大注册者数量时,它不会将描述更新为新的描述。我没有包括脚本中详细说明calProperties的部分。
function modifyEvents() {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName("Events");
var sheetR = ss.getSheetByName("Registration");
我知道>> (比)大两倍,但是>>>到底做了什么呢?
System.out.println(16>>>2); // OK
System.out.println(8>>>2); // OK
System.out.println(8>>>2); // OK
System.out.println(8<<<2); // not OK
需要对Int64变量进行移位。我正在解析一个数据库文件中的伪数学函数。变量是uint32或int32,所以我把它们放到一个Int64中,以便平等地处理它们,而不会丢失任何东西。在我的一个树节点中,我需要对Int64进行位移位。
不幸的是,移位运算符不适用于Int64。有没有我不知道的位移位Int64的标准方法?
//Int32 Example works
int a32 = 1;
int b32 = 2;
int c32 = a32 >> b32;
//Int64 Example does not compile
Int64 a64 = 1;
Int64 b64 = 2;
Int
我只是被这个小逻辑困住了,说我搞错了。
int是32位,所以假设二进制数为20就像
// 00000000000000000000000000010100
。。现在,如果我执行正确的移位操作,比如说4
int a = 20>>4;
// 00000000000000000000000000000001
..so结果为1
现在说我再拿20并做5次右转操作
int b = 20>>5; //00000000000000000000000000000000
..so结果为0
如果我做32次右班..。为什么我得到的号码和我分配的一样?
int c
通常,C要求将二元运算符的操作数提升为更高级别的操作数类型。可以利用这一点来避免使用冗长的强制转换填充代码,例如:
if (x-48U<10) ...
y = x+0ULL << 40;
等。
然而,我发现,至少在gcc身上,这种行为不适用于位移位。也就是说。
int x = 1;
unsigned long long y = x << 32ULL;
我期望右操作数的类型会导致左操作数被提升为unsigned long long,以便移位成功。但相反,gcc打印了一条警告:
warning: left shift count >= width of type