反转双倍值

时间:2014-04-17 19:48:57

标签: objective-c double reverse

我试图像这样反转一个双重值:

输入:1020304050 ......输出:5040302010 2位数的组保持相同的顺序。所以10不会变成01.或者53不会变成35。

输入将始终具有偶数位数,因此配对不是问题。

2个相邻的数字实际上是函数的代码。我想保持这一点,以便我可以再次应用该功能。

double temp = 0.0;
    double Singlefilter=1;
    double reverseString=0;
    temp=filtersequence;

    while (temp>0)
    {


        Singlefilter=fmod(temp, 100.00);
        temp=temp/100;

        reverseString=(reverseString+Singlefilter)*100;
        NSLog(@"reversed string of filter %f",reverseString);

    }

但我不知道为什么这不起作用。这会产生随机非常大的值。


[此问题已被Reverse a double value while maintaining 2 adjacent digits in same format]

取代

3 个答案:

答案 0 :(得分:2)

你可以这样做:

#import <Foundation/Foundation.h>
#include "math.h"

void outputGroupReversed(double filtersequence)
{
    double reverseString = 0.0;
    double temp = filtersequence;

    while (temp > 0.0)
    {
        double groupMultiplier = 100.0;
        double singleFilter = fmod(temp, groupMultiplier);
        temp = floor(temp / groupMultiplier);

        reverseString = reverseString * groupMultiplier + singleFilter;
    }

    NSLog(@"reversed string of filter %f", reverseString);
}


int main(int argc, const char * argv[])
{
    @autoreleasepool {

        outputGroupReversed(1020304050.0);

    }

    return 0;
}

但是,此代码不能正确处理带小数部分的输入。

答案 1 :(得分:1)

最好将它转换为字符串并将其反转。

NSString *inputString = [@(input) stringValue]; // Eg 1230
NSMutableString *reversedString = [NSMutableString string];
NSInteger charIndex = [inputString length];
while (charIndex > 0) {
    charIndex--;
    NSRange subStrRange = NSMakeRange(charIndex, 1);
    [reversedString appendString:[inputString substringWithRange:subStrRange]];
}
double result = [reversedString doubleValue]; // Eg 0321 -> 321
// Go back to NSString to get the missing length
NSString *resultString = [@(result) stringValue]; // Eg. 321

// Multiple by factors of 10 to add zeros
result *= exp(10, [inputString length] - [resultString length]); // 3210

NSLog(@"reversed value %f", result);

来自this answer的反向字符串方法。

答案 2 :(得分:1)

如果您希望将2位十进制整数存储在一起作为单个数值,则最好使用uint64_t - 无符号长64位整数而不是double。那将精确存储9对两位小数,这看起来比你需要的多一个(你在评论中提到16位数字)。

只要打包对的 numeric 值不重要,只需将8个2位十进制数(即0 - > 99)打包成一个数值即可你可以做得更好。 64位整数是8对2个十六进制数字,或8个8位字节,因此您可以存储8个值0 - &gt;每字节99个。现在,添加和提取值变为按位移位(>><<运算符)8和按位 - 或(|)和按位 - 和(&)。这至少可以清楚地表明你正在打包价值,其中除以其余的不是。

但还有另一个回报,你的反转&#34;现在,操作变为对CFSwapInt64()的单个调用,这会调整字节的顺序。

但是如上所述,你真的应该看看你的模型并考虑你正在做的事情的另一种数据类型 - 程序必须将多个值打包成单词以节省空间的日子已经过去了。

例如,为什么不使用8位(uint8_t values[8])整数的(C)数组?如果您需要,可以将其放在struct中并将其作为单个值传递。