【问题标题】:bitwise operator on android : why large numbers are not equalsandroid上的按位运算符:为什么大数不等于
【发布时间】:2016-07-11 22:02:04
【问题描述】:

假设我在一个运行在模拟器(marshmallow,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

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

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

【问题讨论】:

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


    【解决方案1】:

    默认情况下,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
    

    【讨论】:

    • 或者只是1L &lt;&lt; 33
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2023-04-04
    • 2012-04-23
    • 2022-09-24
    • 2015-10-22
    • 2011-03-13
    • 2018-05-17
    相关资源
    最近更新 更多