2011-03-21 65 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