按位运算的错误结果r << 24,为什么?

问题描述 投票:1回答:1

我有一个枚举:

public enum STAR_TYPE {
    FAST(255, 255, 255),
    NORMAL(190, 190, 190),
    SLOW(120, 120, 120);

    private int color;

    private STAR_TYPE(int r, int g, int b) {
        int R = r << 24;
        int G = g << 16;
        int B = b << 8;
        color = R | G | B | 0xff;
    }

    public static STAR_TYPE getRandomType() {
        return values()[MathUtils.random(0, values().length - 1)];
    }

    public int getColor() {
        return color;
    }
}

我想将RGBA值转换为透明度始终为255的整数。为此,我正在使用按位运算。但是r << 24不起作用。它返回错误的结果。

对于255 r << 24应该返回4278190080,但它返回-16777216。

对于190 r << 24应该返回3187671040,但它返回-1107296256。

仅适用于120 r << 24会返回2013265920的正确结果。

我发现计算得出的值为带符号2的补码的小数。很高兴知道,但我从未要求过。我想拥有积极的价值。如何获得所需的值?我很困惑。

java bitwise-operators bit-shift
1个回答
2
投票

您正在误解这是负面的意义。

您正在将四个8位值打包为一个32位值:

RRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA

如果设置了最高有效位,即最左边的R位(即,您的R值至少为128),则相应的32位int值为负。

但是,就整数值而言,这实际上并不意味着任何东西。从某种意义上讲,您正在使用int数据类型存储四个8位值来滥用它。碰巧的是,由此产生的某些32位值也用于表示负数。

© www.soinside.com 2019 - 2024. All rights reserved.