English 中文(简体)
将多个 Ints 编码为双
原标题:Encode Multiple ints into a double
  • 时间:2012-05-25 06:18:49
  •  标签:
  • c++
  • encoding

我想把一对一整副注解编码成双倍。例如,我想通过一个函数:

foo(int a, int b)

但我只想要一个双倍代表两点:

foo(double aAndB)

目前,我这样做的方法是在小数点位的两侧各有一英寸(即10和15将变为10.15),然后将其转换为弦流符号和提取这两个数字。

然而,在10和10之间,这显然有缺陷,它变成了10.1。

有没有办法通过一些复杂的数学方法来做到这一点? 这样我就能通过一个代表两英寸的双倍函数?

谢谢

最佳回答

因为(通常)一个双倍有64位数, 而每英寸有32位数, 你就会认为你可以直接将这些位数存储在双倍数中, 例如 :

int32_t i1 = rand();
int32_t i2 = rand();
int64_t x = (((int64_t)i1)<<32) | ((int64_t)i2);
double theDouble;
memcpy(&theDouble, &x, sizeof(theDouble));

并且“ 几乎有效 ” 。 也就是说, 它对于许多可能的 i1 和 i2 值有效, 但对于所有这些值都无效。 特别是对于 IEEE 754 浮动点格式, 任何将指数位设为 0x7ff 的值都将被视为表示“ NAN ”, 而浮动点硬件可以(而且确实) 将不同的 NaN 等值位式比特式转换回其首选的 NaN 比特式, 当将双倍的比特式转换为 。

由于这个原因,把两个32位整数加到一个双倍中, 似乎在大多数情况下是有效的, 但如果你用所有可能的输入值测试它, 你会发现一些情况, 在它们停留在双倍中时, 其值突变, 当它们再次解码时, 它们作为不同的值出来。

当然,你只要小心地把曼特萨比特设置为双倍就可以绕过它,但这只能给您每整数26比特, 这样您只能存储 +/- 33, 554, 432 的整数值。 也许这样行得通, 取决于您使用的情况 。

我的建议是, 找到一种不同的方法来做任何你想做的事。 将非浮点数据存储在一个浮动点变量中会引起麻烦, 特别是如果您想要您的代码是便携式的话 。

问题回答

如果你运气好,一整块是半倍 你可以储存这样的一整块:

int a = 10;
int b = 20;
double d;

*(int *)&d = a;
*((int *)&d + 1) = b;

int outa = *((int *)&d);
int outb = *(((int *)&d) + 1);
printf("%d %d
", outa, outb);

这在一般/可移动性方面不起作用。 如果双元和元的位数与您想要的位数相同, 则不可能 。

双倍可以完全代表一个总计53位数的整数。 如果您想要持有一个 26 位数和一个 27 位数整数, 它很容易 : < code> 双倍组合 = bit27 * 67108864. 0 + bit26;

请注意,67108864是226。

尝试定义这样的联盟 :

struct two_int {
    int a;
    int b;
};

union encoding {
    struct two_int a;
    double c;
};

但这样做可能会给可移动性带来问题。 请双倍检查, 并用适合您案件的方法 。

您可以使用二进制面罩和从“双倍”中提取信息来做到这一点。

例如:

double encode(int a, int b)
{
    double d = 0;
    d = d | a; 
    d = d | (b << 8);
    return d;
}

double decode(double d)
{
    a = d & 0xFF;
    b = (d >> 8) & 0xFF;
}

在编码部分,a 将在双变量 d, b 的低8位数中。

如果您总是将两个字移到这个参数上, 那么通过一个双字是没有道理的。 相反, 将两个字移到一个字, 或者将两个字移到一个柱状中 。

你这样做的方式使你没有机会发现真正的双倍和两点之间的差别。因此,我的结论是,通过做我上面描述的,你不会失去任何功能。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签