检查BigNum上是否设置了位

时间:2011-10-26 13:07:12

标签: bitwise-operators bignum arbitrary-precision

我有一个像这样的字符串格式化的bignum:“123456789123456789123456789”我需要检查是否设置了指定的位。组件在此字符串中是单个数字。

如果我想检查第54位是否设置,通常我会这样做:NyNumber&(1<< 54)

问题是我在我正在使用的bignum库中没有AND或SHIFT。

所以问题是;如何检查是否在格式化为任意大小的字符串的数字中设置了一个位?

编辑:只是为了澄清:我正在使用名为Autoit3的小型脚本语言,其中包含以下库:http://www.autoitscript.com/forum/topic/83529-bignum-udf,它将BigNums表示为字符串。

2 个答案:

答案 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") );

    }