簡體   English   中英

Java中的整數用於哪個位

[英]Which bit is on for an integer in Java

我編寫了這段代碼來檢查Java中Integer(如果用二進制表示)的哪些位是打開的:

public static List<String> list(int val)
{
    List<String> dummyList = new ArrayList<String>();

    int bit = 1;
    int x;

    for(int i=0; i<32; i++)
    {
        x = bit;
        if((x&val)!=0)
            dummyList.add(String.valueOf(i+1));
        bit = bit << 1;
    }

    return dummyList;
}

上面編寫的代碼工作正常。 但是它有一個運行32次的循環(在Java整數中是32位長)。 我想盡量減少這種復雜性。 請分享更好的解決方案。 提前致謝。

您可以使用位掩碼來嘗試減少循環的時間。 您添加了一些操作,但可能會執行一半的循環:

public static List<String> list(int val) {
    List<String> dummyList = new ArrayList<String>();
    int loop = 32;

    // Mask the 16 MSB if all are zero only loop on the 16 LSB
    if((val & 0xFFFF0000) == 0){
        loop = 16;
    }

    int bit = 1;
    int x;

    for (int i = 0; i < loop; i++) {
        x = bit;
        if ((x & val) != 0) {
            dummyList.add(String.valueOf(i + 1));
        }
        bit <<= 1;
    }

    return dummyList;
}

這可能會增加時間,具體取決於進入的數據。

您還可以通過一次執行兩個位來減少一半的循環:

public static List<String> list(int val) {
    List<String> dummyList = new ArrayList<String>();

    int bit = 3;
    int x;

    for (int i = 0; i < 32; i += 2) {
        x = (bit & val);
        switch (x) {
            case 1:
                dummyList.add(String.valueOf(i + 1));
                break;
            case 2:
                dummyList.add(String.valueOf(i+2));
                break;
            case 3:
                dummyList.add(String.valueOf(i+1));
                dummyList.add(String.valueOf(i+2));
                break;
            default:
        }
        val >>= 2;
    }

    return dummyList;
}

復雜性是O(1),因此在那里“最小化”並不多。

你的代碼還可以..這里稍微重構一下。

public static List<String> list(int val) {
    List<String> dummyList = new ArrayList<String>();
    for (int i = 0; i < 32; i++)
        if ((1 << i & val) != 0)
            dummyList.add("" + (i+1));
    return dummyList;
}

順便說一下,你考慮過使用BitSet嗎?

32個循環聽起來不錯。 如果要更快地收集數字,可以使用StringBuffer而不是List。

public static String list(int val)
{
    StringBuffer dummyList = new StringBuffer();

    int bit = 1;
    int x;

    for(int i=0; i<32; i++)
    {
        x = bit;
        dummyList.append((x&val) ? '1' : '0' );
        bit = bit << 1;
    }

    return dummyList.toString();
}

改進O(1)代碼似乎微不足道,但這段代碼略有改進:

public static List<String> list(int val) {
    List<String> dummyList = new ArrayList<String>();
    for (int i=0; val!=0 && i<32; ++i){
        if ((1 << i & val) != 0) {
            dummyList.add("" + (i+1));
            val &= val -1;  // unset the last set bit (current bit)
        }                   // causes loop to end early when all bits are counted
    }
    return dummyList;

而不是進行所有32位比較,此代碼將在最后一位計數后立即結束。 這是對於那些人口稀少整數更有效的1秒和沒有對這些人口稠密的整數效率較低。

既然你知道整數的確切長度,我建議使用bool[]代替。 盡管如此,你對復雜性無能為力。 它的速度和它一樣快,JIT可能會打開這段代碼的循環。

public static bool[] list(int val)
{
    bool[] a = new bool[32];
    for(int i=0; i<32; i++)
    {
        a[i] = ((1 << i) & val) != 0;
    }
    return a;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM