【问题标题】:Bitwise devision? (Changing formats of ints)按位除法? (改变整数的格式)
【发布时间】:2011-05-01 20:38:21
【问题描述】:

我正在使用 Java。我有一个整数,其中:

24-31 位是 alpha,16-23 位是红色, 8-15 为绿色,0-7 为蓝色。

我想将其更改为 int where:

位 5-7 为红色,2-4 位为绿色,0-1 位为蓝色。

我不确定如何最好地解决这个问题。 (很明显,可表现的颜色会失去一些保真度。这是可以接受的,只要它是成比例的,所以颜色看起来大致相同。)

我可以分开吗?

【问题讨论】:

    标签: java colors bit-manipulation


    【解决方案1】:

    我建议你

    int argb =
    // extract the colours. 
    int red = (argb >> 16) & 0xFF;
    int green = (argb >> 8) & 0xFF;
    int blue = argb & 0xFF;
    
    // reduce the number of bits.
    red >>= 5;
    green >>= 5;
    blue >>= 6;
    
    // build the new value
    int rgb2 = (red << 5) + (green << 2) + blue;
    

    【讨论】:

    • &amp; 0xFF 的目的是在进行转换之前获取所有 8 位。最简单的方法是删除较低的位(如@Alnitak 所做的那样),但您可能希望对结果或其他内容进行舍入。 argb 是 alpha/red/green/blue 的缩写。如果你想改变这个值,你可以在最后一行分配它而不是rgb2
    • 你应该得到 233。这就是我运行代码时得到的结果。 -1355953 是二进制的 11111111 11101011 01001111 01001111,如果你跳过第一个字节并取前 3 位,前 3 位和前 2 位你得到 111 010 01,即 233。
    【解决方案2】:

    没有。你需要做位移和屏蔽。

    例如,要获得红色,您需要 3 位。所以你需要抓住红色的最高位,即第 23、22 和 21 位。

    所以

    int red = ((color >> 21) & 0x07); // gets the top 3 bits of the src red, and put in bottom of int
    int newColor = red << 4; // shift back up to the new color
    

    您必须为每个组件执行此操作,或者 (|) 将值转换为新颜色

    【讨论】:

      【解决方案3】:

      对于每个组件,移位并屏蔽最低有效位。

      总而言之,如果col 是您的原始颜色,那么:

      r = (col >> 21) & 0x07; // bits 21 - 23
      g = (col >> 13) & 0x07; // bits 13 - 15
      b = (col >>  6) & 0x03; // bits  6 -  7
      

      你的新价值是:

      (r << 5) | (g << 2) | b
      

      或者,将其全部归为一个表达式:

      rgb = (col & 0xe00000) >> 16 | (col & 0xe000) >> 11 | (col & 0xc0) >> 6; 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-23
        • 2023-01-20
        • 2012-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多