任意精度位操作(目标C)

时间:2012-08-30 21:23:57

标签: objective-c integer bit-manipulation nsdata arbitrary-precision

我需要在Objective C中对任意精度数的表示进行位操作。到目前为止,我一直在使用NSData对象来保存数字 - 有没有办法对那些内容进行位移?如果没有,是否有不同的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

使用NSMutableData,您可以获取char中的字节,移位您的位并将其替换为-replaceBytesInRange:withBytes:

除了使用char *缓冲区编写自己的日期持有者类来保存原始数据之外,我没有看到任何其他解决方案。

答案 1 :(得分: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,以及其他罪行。