android 上的按位运算符:为什么大数不等于
bitwise operator on android : why large numbers are not equals
假设我在模拟器(棉花糖,OSX 64 位)上运行的 android 应用程序中编写了一些非常简单的测试,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));
…logcat 打印:
long int = 17301768
long int = 17301768
long int = 8607236360
long int = 17301770
显然,最后一行不正确:它应该与第三行相同。
为什么?
我怎样才能让它按预期工作?
默认情况下,Java 中的所有数字都是 int
类型。因此,您使用二进制运算创建的数字也是 int 值:
(1<<3 | 1<<8 | 1<<19 | 1<<24 | 1<<33)
1<<33 = 2
1L<<33 = 8589934592
int
值限制为 31 位 + 1 位用于指示 positive/negative 值。
因此设置第 34 位不会改变任何东西。
要使其正常工作,您必须为所有不适合 int 的位显式使用 long 值。您可以通过在数字中添加 "L" 来做到这一点。
System.out.println((1<<3 | 1<<8 | 1<<19 | 1<<24 | 1L <<33)); // 8607236360
假设我在模拟器(棉花糖,OSX 64 位)上运行的 android 应用程序中编写了一些非常简单的测试,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));
…logcat 打印:
long int = 17301768
long int = 17301768
long int = 8607236360
long int = 17301770
显然,最后一行不正确:它应该与第三行相同。
为什么? 我怎样才能让它按预期工作?
默认情况下,Java 中的所有数字都是 int
类型。因此,您使用二进制运算创建的数字也是 int 值:
(1<<3 | 1<<8 | 1<<19 | 1<<24 | 1<<33)
1<<33 = 2
1L<<33 = 8589934592
int
值限制为 31 位 + 1 位用于指示 positive/negative 值。
因此设置第 34 位不会改变任何东西。
要使其正常工作,您必须为所有不适合 int 的位显式使用 long 值。您可以通过在数字中添加 "L" 来做到这一点。
System.out.println((1<<3 | 1<<8 | 1<<19 | 1<<24 | 1L <<33)); // 8607236360