[英]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.