【发布时间】:2010-11-15 03:49:41
【问题描述】:
我想要什么:
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”或将 0 替换为 1,反之亦然
【问题讨论】:
标签: ruby operators bit-manipulation