假设我在一个Android应用程序中编写了一些非常简单的测试,这个应用程序在模拟器上运行(marshmallow,OSX 64位)和logcat输出:
Button button = theView.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(v.isEnabled()){
v.setEnabled(false);
}
//Call your new activity here
...activity stuff...
}
});
... logcat打印:
Log.i("test","long int = "+17301768L);
Log.i("test","long int = "+(1<<3 | 1<<8 | 1<<19 | 1<<24));
Log.i("test","long int = "+ 8607236360L);
Log.i("test","long int = "+(1<<3 | 1<<8 | 1<<19 | 1<<24 | 1<<33));
显然,最后一行不正确:它应该与第三行相同。
为什么? 我怎样才能使它按预期工作?
答案 0 :(得分:3)
默认情况下,Java中的所有数字都是int
类型。因此,使用二进制运算创建的数字也是int值:
(1<<3 | 1<<8 | 1<<19 | 1<<24 | 1<<33)
1<<33 = 2
1L<<33 = 8589934592
int
值限制为31位+ 1位,用于指示正/负值。
因此,设置第34位不会改变任何内容。
要使其工作,您必须为不适合int的所有位显式使用long值。你可以通过在数字上添加“L”来做到这一点。
System.out.println((1<<3 | 1<<8 | 1<<19 | 1<<24 | 1L <<33)); // 8607236360