我试图像这样反转一个双重值:
输入: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]
取代答案 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
中并将其作为单个值传递。