2011-03-21 63 views
0

如何在双执行二进制补码,并返回一个双?二进制补上了双

+2

你不知道。二的补码在双精度(超出比特级别)上没有意义。逻辑上,你可以应用减号运算符:'-d' – 2011-03-21 18:59:31

+3

在double上的二进制补码对我来说没有多大意义;什么是应用程序? – 2011-03-21 18:59:50

+1

我想你应该先了解数字(位串)是如何表示的。 http://www.swarthmore.edu/NatSci/echeeve1/Ref/BinaryMath/NumSys.html的类型double(双精度)对象被表示在一个完全不同的方式不是整数(二进制补码)。这就是为什么你的问题没有意义 – JeffE 2011-03-21 19:35:12

回答

2

如果你正在尝试做两个的补充内部比特表示的双倍,可以使用BitConverter class

喜欢的东西:

double x = 12345.6; 
Int64 bits = BitConverter.DoubleToInt64Bits(x); 
bits = ~bits + 1; 
x = BitConverter.Int64BitsToDouble(bits); 

我不知道你为什么会想这样做,虽然...

-1

您可能需要转换为长,然后执行二进制补码和投退:

double x = 1245.1; 
long l = (long)x; 
l=~l; l++; /* complement followed by + 1 */ 
x = (double)l; 

我没有测试这一点,但希望它可以让你在正确的轨道上。

编辑:既然你无法从双投至长用比特表示,那么你可能需要做一些事情,如:

double x = 1234.5; 
ulong l; 
unsigned char * d = (unsigned char *) &x; 
l = (ulong)(*d); 
l=~l; l++; 
d = (unsigned char *) &l; 
x = (double)(*d); 

同样未经测试...

+0

一元补数没有为双打定义。 – Jimmy 2011-03-21 19:01:38

+0

另外,你需要做'l =〜l;',而不是'〜l;'。 – Justin 2011-03-21 19:04:49

+1

在'long'和'double'之间使用值而不是内部位表示。 – Justin 2011-03-21 19:11:31