我必须处理用2 ^ k基数写的非常大的数字。我做了一个基于数组的表示法,例如数字751表示为long [] {0,7,5,1},-751表示长[] {1,7,5,0}。
我的问题是如何将它们转换为二进制表示?我想避免将它们转换为BigInteger并进行分割。 如果是负数,我需要两个补码。
答案 0 :(得分:0)
这绝不是base-2 ^ k编码;它是一个基数为10的编码:
751在基数10中表示为long [] {0,7,5,1},因为 751是7 * 10 ^ 2 + 7 * 10 ^ 1 + 1 * 10 ^ 0
此将作为base-16编码:
1873在基数16中表示为long [] {0,7,5,1},因为 1873年是7 * 16 ^ 2 + 5 * 16 ^ 1 + 1 * 16 ^ 0
假设long[] n
位于基数2 ^ k,那么
value = n[0]*(2^(k*(n.length-1)) + ... + [n.length-1]
(这不是你在现实生活中会做的事情:你会使用BigInteger)
然后转换为二进制很简单:
StringBuilder binaryString = new StringBuilder();
for (long l : n) {
binaryString.append(binaryFor(l));
}
也就是说,只需将每个数组元素转换为二进制字符串并连接所有内容即可。
在数组中编码整数的更好方法是将单位置于n [0],而不是n [length-1];然后你需要使用prepend而不是append。