4 回答
TA贡献1848条经验 获得超2个赞
您的代码的问题是您正在查看的数组索引。当你输入数字 8 时,它的二进制表示是 1000。当你将它拆分成一个数组时,你会得到:
索引:0 1 2 3 值:1 0 0 0
因为您是从列表末尾开始,所以索引 0 将最后处理(并且与 2^0 相同)。
要解决此问题,您所需要做的就是反转您正在查看的元素的顺序,同时保持 for 循环的顺序相同。例如:而不是:
gigaBitArray[counter]
它应该是:
gigaBitArray[gigaBitArray.length -1 - counter]
TA贡献1895条经验 获得超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贡献1827条经验 获得超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贡献1824条经验 获得超6个赞
这是一种方法。代码中的注释不明显。这里的想法是计算机内的所有信息都是binary。字符和数字是根据 打印出来的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);
}
上面打印出以下内容:
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]
添加回答
举报