4 回答

TA貢獻(xiàn)1848條經(jīng)驗 獲得超2個贊
您的代碼的問題是您正在查看的數(shù)組索引。當(dāng)你輸入數(shù)字 8 時,它的二進制表示是 1000。當(dāng)你將它拆分成一個數(shù)組時,你會得到:
索引:0 1 2 3 值:1 0 0 0
因為您是從列表末尾開始,所以索引 0 將最后處理(并且與 2^0 相同)。
要解決此問題,您所需要做的就是反轉(zhuǎn)您正在查看的元素的順序,同時保持 for 循環(huán)的順序相同。例如:而不是:
gigaBitArray[counter]
它應(yīng)該是:
gigaBitArray[gigaBitArray.length -1 - counter]

TA貢獻(xiàn)1895條經(jīng)驗 獲得超3個贊
您首先測試低位。如果您希望首先列出高階冪,則需要一個索引變量和一個冪變量。另外,無需檢查“0”。如果它不是“1”,那么它一定是“0”。
int iIndex;
int iLength = gigaBitArray.length;?
int iPower = iLength - 1;
for ( iIndex = 0; iIndex < iLength; ++iIndex, --iPower )
{
? ? if ( gigaBitArray[iIndex].equals("1") )
? ? {
? ? ? ? powers.add((int)Math.pow(2, iPower));
? ? }
? ? else
? ? {
? ? ? ? powers.add(0);
? ? }
}

TA貢獻(xiàn)1827條經(jīng)驗 獲得超8個贊
0除了上面的兩個答案之外,您還可以通過將s 和s相乘來消除 if else 1:
int len = gigaBitArray.length;
for (int i = 0; i < gigaBitArray.length; i++) {
powers.add((int)Math.pow(2, --len)*Integer.parseInt(gigaBitArray[i]));
}

TA貢獻(xiàn)1824條經(jīng)驗 獲得超6個贊
這是一種方法。代碼中的注釋不明顯。這里的想法是計算機內(nèi)的所有信息都是binary。字符和數(shù)字是根據(jù) 打印出來的context。由于所有信息都是二進制的,因此可以將shifted left or right位字段向相同方向移動。這允許檢測 a1或0bit,而無需求助于字符串操作的開銷。
for (int number : new int[] { 8, 10, 23, 11, 2, 4, 99
}) {
List<Integer> powers = new ArrayList<>();
// starting bits to shift
int shift = 0;
// save number for printout
int save = number;
while (number > 0) {
// ANDing the number with 1 will mask the
// low order bit to a 1 or 0.
// Then shift that bit "shift" number
// of bits (first time thru is 0) and store
// the power in p. Then increment # of bits
// to shift.
int p = (number & 1) << shift++;
//add power to beginning of list.
powers.add(0, p);
// now shift the number right by 1 to position
// for next bit.
number >>= 1;
}
System.out.printf("%3d -> %s%n", save, powers);
}
上面打印出以下內(nèi)容:
8 -> [8, 0, 0, 0]
10 -> [8, 0, 2, 0]
23 -> [16, 0, 4, 2, 1]
11 -> [8, 0, 2, 1]
2 -> [2, 0]
4 -> [4, 0, 0]
99 -> [64, 32, 0, 0, 0, 2, 1]
添加回答
舉報