## ~x + ~y == ~(x + y) is always false?

Does this code always evaluate to false? Both variables are two's complement signed ints.

``````~x + ~y == ~(x + y)
``````

I feel like there should be some number that satisfies the conditions. I tried testing the numbers between `-5000` and `5000` but never achieved equality. Is there a way to set up an equation to find the solutions to the condition?

Will swapping one for the other cause an insidious bug in my program?

Assume for the sake of contradiction that there exists some `x` and some `y` (mod 2n) such that

``````~(x+y) == ~x + ~y
``````

By two's complement*, we know that,

``````      -x == ~x + 1
<==>  -1 == ~x + x
``````

Noting this result, we have,

``````      ~(x+y) == ~x + ~y
<==>  ~(x+y) + (x+y) == ~x + ~y + (x+y)
<==>  ~(x+y) + (x+y) == (~x + x) + (~y + y)
<==>  ~(x+y) + (x+y) == -1 + -1
<==>  ~(x+y) + (x+y) == -2
<==>  -1 == -2
``````

Hence, a contradiction. Therefore, `~(x+y) != ~x + ~y` for all `x` and `y` (mod 2n).

*It is interesting to note that on a machine with one's complement arithmetic, the equality actually holds true for all `x` and `y`. This is because under one's complement, `~x = -x`. Thus, `~x + ~y == -x + -y == -(x+y) == ~(x+y)`.

## HW impossibility?: "Create a rock paper scissors program in ruby WITHOUT using conditionals"

I'm in an introductory software development class, and my homework is to create a rock paper scissors program that takes two arguments (rock, paper), etc, and returns the arg that wins.

Now I would make quick work of this problem if I could use conditionals, but the assignment says everything we need to know is in the first three chapters of the ruby textbook, and these chapters DO NOT include conditionals! Would it be possible to create this program without them? Or is he just expecting us to be resourceful and use the conditionals. It's a very easy assignment with conditionals though...I'm thinking that I might be missing something here.

EDIT: I'm thinking of that chmod numerical system and think a solution may be possible through that additive system...

``````def winner(p1, p2)
wins = {rock: :scissors, scissors: :paper, paper: :rock}
{true => p1, false => p2}[wins[p1] == p2]
end
``````

winner(:rock, :rock) # => :rock d'oh! – tokland

Per @sarnold, leaving this as an exercise for the student :).