我想什么:如何使用Ruby的按位运算符来计算补码?
assert_equal 6, ones_complement(9) # 1001 => 0110
assert_equal 0, ones_complement(15) # 1111 => 0000
assert_equal 2, ones_complement(1) # 01 => 10
输入的大小是不固定的,如4位或8位。而是它的一个二进制流。
我看到:
v = "1001".to_i(2) => 9
有一个位翻转操作~
(~v).to_s(2) => "-1010"
sprintf("%b", ~v) => "..10110"
~v => -10
我认为它得到的东西与一位做用来存储符号或东西...能有人解释这个输出?如何获得补码而不诉诸字符串操作,如从sprintf输出中删除最后n个字符以获得“0110”或用1代替0,反之亦然
P.S.我不使用Ruby,但是在Python中,9^15返回6(即1001 xor 1111是0110)。 – Cascabel 2009-07-29 17:14:45
Ruby中的9^15 => 6也是如此。谢谢..我的脑细胞似乎已经称它为一天。需要睡觉..我想。 – Gishu 2009-07-29 18:07:20
1^0b1111 == 1,而不是2.您如何决定使用多少个前导零?实际上, – AShelly 2009-07-29 19:01:53