From: David MacMahon <davidm@...>
Date: 2013-07-30T13:13:23+09:00
Subject: [ruby-core:56264] Re: [ruby-trunk - Bug #8697] Fixnum complement operator issue

The bit inverted VALUE is OR'd with FIXNUM_FLAG so that Ruby will still recognize the VALUE as a Fixnum.  It is NOT done to convert to two's complement (which would actually require adding 1 to the bit inverted value rather).

You can see that the OR with FIXNUM_FLAG does not show up in the result by looking at the binary representation of any bit inverted odd number (e.g. ~1):

$ ruby -e 'puts "%b" % ~1'
..10

Dave

On Jul 28, 2013, at 1:39 AM, torimus (Torimus GL) wrote:

> 
> Issue #8697 has been updated by torimus (Torimus GL).
> 
> 
> =begin
> As you've admitted, ~ operator implementation does more than ((*just flipping of it's each bit*)). It also does an additional step when converting to two's complement by doing bitwise or with number 1 ((({return ~num | FIXNUM_FLAG}))). As the rest of bit operators also counts in two's complement and also #to_s method is aware of it, this fact is then shadowed. If Ruby wouldn't automatically convert to BigDecimal when the register size is exceed, this would show off when the highest bit 'overflows'.
> 
> I can understand why Ruby does this conversions internally but I see no reason for vague descriptions in the documentation and hiding this fact. Why current text to FixNum's ~ simply doesn't speak about two's complement directly ?
> =end
> 
> ----------------------------------------
> Bug #8697: Fixnum complement operator issue
> https://bugs.ruby-lang.org/issues/8697#change-40731
> 
> Author: torimus (Torimus GL)
> Status: Feedback
> Priority: Normal
> Assignee: 
> Category: core
> Target version: current: 2.1.0
> ruby -v: 1.9.3p448
> Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN
> 
> 
> =begin
> By the ((<documentation|URL:http://www.ruby-doc.org/core-2.0/Fixnum.html#method-i-7E>)), bitwise complement operator ((*~*)) to Fixnum instance should do ((*one's complement*)) with just flipping all bits. In fact, current implementation does ((*two's complement*)) due to or-ing with FIXNUM_FLAG, which is defined as 1.
> 
> Either fix the documentation or the fix_rev function implementation.
> Affected versions: both 1.9.3 and 2.0.0
> =end
> 
> 
> 
> -- 
> http://bugs.ruby-lang.org/
>