android上的按位运算符:为什么大数字不等于

时间:2016-03-24 10:31:46

标签: android bit-manipulation bit-shift bitmask binary-operators

假设我在一个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));

显然,最后一行不正确:它应该与第三行相同。

为什么? 我怎样才能使它按预期工作?

1 个答案:

答案 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