繁体   English   中英

更改Java中32位整数的特定位

[英]Altering specific bits of a 32-bit integer in Java

背景:我有一个32位整数,其二进制表示形式如下:

1111 1111 0000 0000 0000 0000 1111 1111

注意:这是Color.BLUE的ARGB值的二进制表示Color.BLUE 我将其用于说明目的,但这与我要解决的情况有关。

问题:我正在尝试更改高阶位,以使其二进制表示形式如下所示:

1000 0000 0000 0000 0000 0000 1111 1111

或更简单地说,应该更改前八个高阶位,如下所示:

1111 1111 -> 1000 0000

当前的解决方案尝试:到目前为止,通过屏蔽掉前八个高阶位,然后使用按位“或”“添加”所需的值,我已经取得了成功,如下所示:

int colourBlue = Color.BLUE.getRGB(); // equal to binary value at top of question
int desiredAlpha = (0x80 << 24); // equal to 1000 0000 0000 0000 0000 0000 0000 0000

// Mask out the eight high order bits, and add in the desired alpha value
int alteredAlphaValue = (colourBlue & 0x00FFFFFF) | desiredAlpha;

尽管目前确实可行,但是自从我的计算机体系结构课程开始以来,已经有一段时间了,我还没有太多的经验,但是使用按位运算符和较低级别的位操作。

我的问题:解决方案是否是完成此任务的正确方法? 如果以某种方式不正确(或只是简单的“哑巴”),那么达到更改特定位的目标的更好(或正确)方法是什么?

从C#转换为Java(未经测试):

public static int setBits(int orig, int newBits, int startBit, int length)
{
    int mask = Mask(startBit, length);
    return (orig & ~mask) | (bits << startBit & mask);
}

public int Mask(int startBit, int length)
{
    if (length ==32)
        return Integer.MAX_VALUE;
    else
        return (1 << (1 << length) - 1) << startbit;
}

或者,如果您愿意,可以直接指定掩码,而避免移位:

public static int setBits(int orig, int newBits, int mask)
{
    return (orig & ~mask) | (bits & mask);

}

当然,如果将RGB值作为32位数字处理,则始终可以将其转换为字节数组 ,反之亦然,这使操作变得更加容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM