[ruby-core:81907] [Ruby trunk Bug#13711][Rejected] Unexpected behavior of bit_length method on negative integers

From: duerst@...
Date: 2017-07-05 01:49:13 UTC
List: ruby-core #81907
Issue #13711 has been updated by duerst (Martin D端rst).

Status changed from Open to Rejected

No further action needed.

----------------------------------------
Bug #13711: Unexpected behavior of bit_length method on negative integers
https://bugs.ruby-lang.org/issues/13711#change-65634

* Author: jzakiya (Jabari Zakiya)
* Status: Rejected
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: 
* Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN
----------------------------------------
The two's complement representation of negative integers produces unexpected results
when the **bit_length** method is applied to them.

```
5.bit_length => 3
4.bit_length => 3
3.bit_length => 2
2.bit_length => 2
1.bit_length => 1
0.bit_length => 0
(-1).bit_length => 0
(-2).bit_length => 1
(-3).bit_length => 2
(-4).bit_length => 2
(-5).bit_length => 3
(-6).bit_length => 3
(-7).bit_length => 3
(-8).bit_length => 3
(-9).bit_length => 4
```

I would have thought that **bit_length** on a negative integer would return the number
of bits it takes to represent a two's complement number on the given cpu/os.

Since the two's complement of negative integers are of the form:

```
-1 =>  111111111111111111
-2 =>  111111111111111110
-3 =>  111111111111111101
-4 =>  111111111111111100
-5 =>  111111111111111011
-6 =>  111111111111111010
-7 =>  111111111111111001
-8 =>  111111111111111000
-9 =>  111111111111110111
```

it thus appears for negative integers **bit_length** returns the bit
position of the left most **0** of the two's complement representation.

Is this correct?
Is this intentional?
If so, can an explanation of this behavior/rationale be given.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next