簡體   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