[Pkg] The Trunk: Kernel-ul.1058.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Feb 10 12:22:08 UTC 2017
Levente Uzonyi uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-ul.1058.mcz
==================== Summary ====================
Name: Kernel-ul.1058
Author: ul
Time: 10 February 2017, 1:16:53.505258 pm
UUID: 62aa1881-7b99-4ba0-bfa5-a2599f1386a9
Ancestors: Kernel-eem.1057
- extracted BitCountPerByteTable from Integer >> bitCount
- added optimized version of #bitCount to SmallInteger
=============== Diff against Kernel-eem.1057 ===============
Item was changed:
Number subclass: #Integer
instanceVariableNames: ''
+ classVariableNames: 'BitCountPerByteTable LowBitPerByteTable'
- classVariableNames: 'LowBitPerByteTable'
poolDictionaries: ''
category: 'Kernel-Numbers'!
!Integer commentStamp: '<historical>' prior: 0!
I am a common abstract superclass for all Integer implementations. My implementation subclasses are SmallInteger, LargePositiveInteger, and LargeNegativeInteger.
Integer division consists of:
/ exact division, answers a fraction if result is not a whole integer
// answers an Integer, rounded towards negative infinity
\\ is modulo rounded towards negative infinity
quo: truncated division, rounded towards zero!
Item was changed:
----- Method: Integer class>>initialize (in category 'class initialization') -----
initialize
+ "Integer initialize"
+
+ self
+ initializeLowBitPerByteTable;
+ initializeBitCountPerByteTable!
- "Integer initialize"
- self initializeLowBitPerByteTable!
Item was added:
+ ----- Method: Integer class>>initializeBitCountPerByteTable (in category 'class initialization') -----
+ initializeBitCountPerByteTable
+ "Initialize BitCountPerByteTable which is a ByteArray that contains the number of set bits (1) of the integers between 0 and 255. It's defined as a class variable so that it can be used from the instance side and subclasses too."
+ "Evaluate this expression to form the byte array:
+ ((0 to: 255)
+ collect: [:i |
+ | bitCount n |
+ n := i.
+ bitCount := 0.
+ [n = 0]
+ whileFalse:
+ [bitCount := bitCount + 1.
+ n := n bitAnd: n - 1].
+ bitCount]
+ as: ByteArray)"
+
+ BitCountPerByteTable := #[0 1 1 2 1 2 2 3 1 2 2 3 2 3 3 4 1 2 2 3 2 3 3 4 2 3 3 4 3 4 4 5 1 2 2 3 2 3 3 4 2 3 3 4 3 4 4 5 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 1 2 2 3 2 3 3 4 2 3 3 4 3 4 4 5 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 3 4 4 5 4 5 5 6 4 5 5 6 5 6 6 7 1 2 2 3 2 3 3 4 2 3 3 4 3 4 4 5 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 3 4 4 5 4 5 5 6 4 5 5 6 5 6 6 7 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 3 4 4 5 4 5 5 6 4 5 5 6 5 6 6 7 3 4 4 5 4 5 5 6 4 5 5 6 5 6 6 7 4 5 5 6 5 6 6 7 5 6 6 7 6 7 7 8]!
Item was changed:
----- Method: Integer>>bitCount (in category 'bit manipulation') -----
bitCount
"Count the number of bits set to 1 in self"
| bitCount |
self < 0 ifTrue: [self error: 'Cannot count bits of negative integers'].
bitCount := 0.
1 to: self digitLength do: [:i |
+ bitCount := bitCount + (BitCountPerByteTable at: (self digitAt: i) + 1) ].
- bitCount := bitCount + (self digitAt: i) bitCountOfByte].
^bitCount!
Item was added:
+ ----- Method: SmallInteger>>bitCount (in category 'bit manipulation') -----
+ bitCount
+ "Count the number of bits set to 1 in self. Overridden for performance"
+
+ | n bitCount |
+ self < 0 ifTrue: [self error: 'Cannot count bits of negative integers'].
+ bitCount := 0.
+ n := self.
+ [ n = 0 ] whileFalse: [
+ bitCount := bitCount + (BitCountPerByteTable at: (n bitAnd: 16rFF) + 1).
+ n := n bitShift: -8 ].
+ ^bitCount!
Item was changed:
----- Method: SmallInteger>>bitCountOfByte (in category 'bit manipulation') -----
bitCountOfByte
"Count the number of bits set to 1 in a byte."
+ ^BitCountPerByteTable at: self + 1!
- ^#[0 1 1 2 1 2 2 3 1 2 2 3 2 3 3 4 1 2 2 3 2 3 3 4 2 3 3 4 3 4 4 5 1 2 2 3 2 3 3 4 2 3 3 4 3 4 4 5 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 1 2 2 3 2 3 3 4 2 3 3 4 3 4 4 5 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 3 4 4 5 4 5 5 6 4 5 5 6 5 6 6 7 1 2 2 3 2 3 3 4 2 3 3 4 3 4 4 5 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 3 4 4 5 4 5 5 6 4 5 5 6 5 6 6 7 2 3 3 4 3 4 4 5 3 4 4 5 4 5 5 6 3 4 4 5 4 5 5 6 4 5 5 6 5 6 6 7 3 4 4 5 4 5 5 6 4 5 5 6 5 6 6 7 4 5 5 6 5 6 6 7 5 6 6 7 6 7 7 8] at: self + 1
-
- "Evaluate this expression to form above byte array:
- ((0 to: 255)
- collect: [:i |
- | bitCount n |
- n := i.
- bitCount := 0.
- [n = 0]
- whileFalse:
- [bitCount := bitCount + 1.
- n := n bitAnd: n - 1].
- bitCount]
- as: ByteArray)"!
More information about the Packages
mailing list