How to compute one's complement using Ruby's bitwise operators?

bit-manipulation, operators, ruby

Solution

It sounds like you only want to flip four bits (the length of your input) - so you probably want to XOR with 1111.

Problem

What I want: ``` assert_equal 6, ones_complement(9) # 1001 => 0110 assert_equal 0, ones_complement(15) # 1111 => 0000 assert_equal 2, ones_complement(1) # 01 => 10 ``` the size of the input isn't fixed as in 4 bits or 8 bits. rather its a binary stream. What I see: ``` v = "1001".to_i(2) => 9 ``` There's a bit flipping operator `~` ``` (~v).to_s(2) => "-1010" sprintf("%b", ~v) => "..10110" ~v => -10 ``` I think its got something to do with one bit being used to store the sign or something... can someone explain this output ? How do I get a one's complement without resorting to string manipulations like cutting the last n chars from the sprintf output to get "0110" or replacing 0 with 1 and vice versa

Original source

Related problems