2015-12-08 71 views
2

如何確定負數FixNum的無符號解釋?無符號等價負數FixNum

# unexpected, true 
(~0b01111011).to_s(2) == ("-" + (~0b01111011).abs.to_s(2)) 

# expected, false 
~0b01111011 == 0b10000100 

我怎麼會寫一個函數,即:

123.unsigned_not(8) == 132 

或者:

-124.unsigned(8) == 132 

編輯:我可以通過串做到這一點,但解決的辦法是遠遠不能滿足

class Fixnum 
    def unsigned_not(bits=16) 
    to_s(2).rjust(bits,'0').gsub(/[01]/, '0' => '1', '1' => '0').to_i(2) 
    end 
end 

回答

1

Fixnum#~符不Two's complement和Ruby內部使用任意大的數字&運算,所以如果你想要做在固定基座上的反轉,則需要在要求的範圍相應的工作,並解釋結果:

class Fixnum 
    def neg(base=8) 
    # xor with max in specific base 
    self^(2**base - 1) 
    end 
end 

132.neg    # 123 
123.neg    # 132 
~-124.neg   # 132 
132.to_s(2)   # 1000010 
132.neg.to_s(2)  # 0111101 
# different result for a different base, as expected 
132.neg(16).to_s(2) # 111111110111101 
0

Ma y爲你可以試試這個測試:

(0x800000FF & ~0b01111011) == (0x800000FF & 0b10000100) 

假設爲0x ...站立六角不斷 和&站立與運算你正在處理的語言。 前導0x8會強制32位擴展?

+0

嗯我非常喜歡這個方向,但你比較的結果是錯誤的 – jchook