0

Objective C で任意精度の数値の表現に対してビット操作を行う必要があります。これまでのところ、数値を保持するために NSData オブジェクトを使用してきました。それらの内容をビット シフトする方法はありますか? そうでない場合、これを達成する別の方法はありますか?

4

2 に答える 2

1

お気づきのとおり、Apple は任意精度のサポートを提供していません。vecLibの 1024 ビット整数より大きいものは提供されません。

NSDataまた、シフトとロールを提供するとは思いません。そのため、自分でロールする必要があります。たとえば、ここに直接入力しているため、いくつかの小さなエラーがある可能性がある非常に素朴なバージョンです。

@interface NSData (Shifts)

- (NSData *)dataByShiftingLeft:(NSUInteger)bitCount
{
    // we'll work byte by byte
    int wholeBytes = bitCount >> 3;
    int extraBits = bitCount&7;

    NSMutableData *newData = [NSMutableData dataWithLength:self.length + wholeBytes + (extraBits ? 1 : 0)];

    if(extraBits)
    {
        uint8_t *sourceBytes = [self bytes];
        uint8_t *destinationBytes = [newData mutableBytes];

        for(int index = 0; index < self.length-1; index++)
        {
            destinationBytes[index] =
                  (sourceBytes[index] >> (8-extraBits)) |
                  (sourceBytes[index+1] << extraBits);
        }
        destinationBytes[index] = roll >> (8-extraBits);
    }
    else 
        /* just copy all of self into the beginning of newData */

    return newData;
}

@end

もちろん、それは、シフトしたいビット数自体がNSUInteger、他の罪の中で表現可能であると仮定しています。

于 2012-08-30T22:22:37.793 に答える
1

を使用NSMutableDataすると、 a のバイトをフェッチし、charビットをシフトして に置き換えることができ-replaceBytesInRange:withBytes:ます。

char *バッファを使用して生データを保持する独自の日付ホルダークラスを作成する以外に、他の解決策はありません。

于 2012-08-30T22:11:09.603 に答える