我有一个像这样的字符串格式化的bignum:“123456789123456789123456789”我需要检查是否设置了指定的位。组件在此字符串中是单个数字。
如果我想检查第54位是否设置,通常我会这样做:NyNumber&(1<< 54)
问题是我在我正在使用的bignum库中没有AND或SHIFT。
所以问题是;如何检查是否在格式化为任意大小的字符串的数字中设置了一个位?
编辑:只是为了澄清:我正在使用名为Autoit3的小型脚本语言,其中包含以下库:http://www.autoitscript.com/forum/topic/83529-bignum-udf,它将BigNums表示为字符串。
答案 0 :(得分:1)
首先,您可以(并且应该)使用库来处理任意精度数字。
在java中,您有BigInteger,在C ++中,您可以使用Gnu's Big Num
如果你不想这样做(我假设你不是在寻找表现),你可以:
将字符串转换为2-complement表示并检查索引。
创建按位和操作,并使用您想要的索引(例如“0100”)的二进制表示形式将字符串转换为基数10.
位移与除以2相同,因此,如果要比特移位54位,则应将数字除以2 ^ 54 。然后,您可以检查数字是偶数还是奇数,如果是偶数,则该位未设置。
如果您使用的是最后一种方法,则可以执行以下操作:
bool bitCheck (number, bitIndex)
pow = 2^bitIndex
shifted = number / pow
return (shifted % 2) == 0
ps:如果你使用gmp,你可以check this page
答案 1 :(得分:0)
将您的字符串转换为二进制字符串,然后检查第54个索引。对于java,您可以尝试使用BigInteger
类。
BigInteger bi = new BigInteger("123456789123456789123456789");
boolean hasBitSet = bi.equals(bi.setBit(54));
修改强>:
byte[] b = "123456789123456789123456789".getBytes("US-ASCII");
int maxIndex = b.length - 1;
for (int bitIdx = 0; bitIdx < (b.length * 8); bitIdx++) {
int index = maxIndex - (bitIdx / 8);
int remainder = bitIdx % 8;
boolean hasBitSet = (((b[index] & 0xff)) & (1 << remainder)) != 0;
System.out.println( bitIdx + (hasBitSet ? " has set" : " has not set") );
}