0

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

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

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

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

编辑:澄清一下:我正在使用一种名为Autoit3的小型脚本语言和以下库:http : //www.autoitscript.com/forum/topic/83529-bignum-udf 将 BigNums 表示为字符串。

4

2 回答 2

1

首先,您可以(并且应该)使用库来处理任意精度数字。

在 java 中你有BigInteger,在 C++ 中你可以使用Gnu 的 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,可以查看这个页面

于 2011-10-26T13:26:39.063 回答
0

将您的字符串转换为二进制字符串,然后检查第 54 个索引。对于java,你可以试试BigIntegerclass。

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

    }
于 2011-10-26T13:14:18.817 回答