0

「123456789123456789123456789」のような文字列のようにフォーマットされたbignumがあり、指定されたビットが設定されているかどうかを確認する必要があります。コンポーネントは、この文字列の 1 桁の数字です。

ビット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 の補数表現に変換し、インデックスを確認します。

  • ビットごとのand操作を作成し、必要なインデックス (たとえば、「0100」) のバイナリ表現を使用して文字列を基数 10 に変換します。

  • ビット シフトは 2 で割ることと同じなので、54 ビットをビットシフトする場合は、数値を 2^54 で割る必要があります。次に、数値が偶数か奇数かを確認できます。偶数の場合、ビットは設定されません。

最後の方法を使用している場合は、次のようなことができます。

bool bitCheck (number, bitIndex) 
    pow = 2^bitIndex
    shifted = number / pow
    return (shifted % 2) == 0

追伸:gmpを使用している場合は、このページを確認できます

于 2011-10-26T13:26:39.063 に答える
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") );

    }
于 2011-10-26T13:14:18.817 に答える