Pharoといっしょ(3) 続Integer、bitShiftと16進数のとりあつかい

Joseph Halfmoon

前回、Smalltalkの法灯を継承するPharoの整数型をちょいと味見してみました。しかし整数といえば16進数がデフォルト、それも頭0ズメ、キッチリ4桁とか8桁とかでないと不安になる年寄です。今回は前回積み残した細々したところを確かめておきます。そんな気にせずとも懐の広いPharo様は受け止めてくれる感じだけれども。

※Pharo関係記事の投稿順Indexは こちら

※今回の動作確認は、Windows11上のWSL2の上のUbuntu24.04LTS上のPharo 10.0.0を使用しています。

Pharo上での16進数の取り扱い

まずは愛してやまない16進数の取り扱いです。心が広いPharo様は2進だろうと16進だろうと「基数rチョメチョメ」なるフォーマットで数値リテラルを受け付けてくれるようです。そして整数オブジェクトに printStringBase:などのメソッドを送れば基数指定しての出力も自由自在っす。こんな感じ。HexNumbers

特にこの、nDigits: 使ってビット幅指定でprintすると、とっても気分が良いな。。。頭の固い年寄だせ。

highbitとlowbit

整数表現のビット幅云々などという、コマケー話は「どうでもよい」Pharo様に独特な概念として、インスタンスメソッド内に以下のような者共が控えてます。

    • highBit
    • highBitOfMagnitude
    • lowBit

「無限に続くかに見える」ビット表現の中で何ビット分の「ビット」が使われているのか知るために必須の情報のようです。highBitlowBit

なお、上記のように負の整数(2の補数表現)にはhighBitが存在せず(上位ビットには「無限に」1が詰まっているから)、その代わりに数値を表現するのに必要なビット数そのものを返してくれるらしい highBitOfMagnitudeが存在します。

シフト演算は符号付き

さて、Pharo様にも and とか or とかのビット演算は存在しますが、特に確認しておきたかったのはシフトです。まずは、左シフトから。正の数1を左1ビットシフト、えい。Lshift1

つづいて負の数ー1を左1ビットシフト、えい。Lshift1M

ここまで期待どおりの結果が返ってきておりますな。

それではSmallIntegerクラスの最小値を右1ビットシフトしたらどうよ。Rshift1M
シフトは符号付き、SmallIntegerの範囲で収まるのであればSmallIntegerのままのようです。あたりまえか。

SmallIntegerからの脱出は見た目シームレス?

しかし前回実験してみたとおり、数学の整数(上下無限大まで連なる)に「寄せて」いるPharo様のIntegerです。ちょっと気を抜くと固定ビット長のSmallIntger範囲を超えてLargeなIntegerへ脱出してくれます。こんな感じ。LshiftL

確かに、maxValを左1ビットシフトしたらLargePositiveIntegerになっている。自然と長大な整数でも扱えるっと。

ことさらに、1を何ビット左シフトしたところにSmallIntegerとLargePositiveIntegerの境界があるのかやってみましたぞ。Lshift59_60

前回みたように、1を60ビット左シフトすると61ビット目に入るので、そこからLargePositiveIntegerみたい。予定通りの挙動だね。

Pharoといっしょ(2) SmallIntegerはint64_tとは違うみたい へ戻る

Pharoといっしょ(4) あちこちの裏で暗躍? Zincなんたら、って何よ? へ進む