2017-07-14 13 views

答えて

1

Tclでの算術演算は、任意の長さの数字を扱っているという考え方に基づいています(実装ではさまざまな内部表現が使用されていますが、そのことについてあまり知らないと思われます)。これは、算術的に変換を行うことを意味します。また、逆の順序で番号を抽出し、その番号が符号なしであることが分かっている場合にも役立ちます。

proc extractIntegers {number {bits 32}} { 
    set accumulator {} 
    set mask [expr {(1 << $bits) - 1}] 
    while {$number != 0} { 
     set value [expr {$number & $mask}] 
     set number [expr {$number >> $bits}] 
     lappend accumulator [format "%#x" $value] 
    } 
    return [lreverse $accumulator] 
} 

puts [extractIntegers 0x111111112222222233333333] 
+0

これを拡張して、負の数(この表現では無限のビット数を持つ)を扱うことがエクササイズとして残されています。 –

0

Donalが指摘する「無限ビット」の場合を処理するために、procを再帰的にすることができます。少なくとも、インタプリタは最終的に最大再帰的深さに達し、エラーになります。

proc extractIntegersRecursive {number {bits 32} {mask 0}} { 
    if {$number == 0} return 
    if {$bits <= 0} {error "invalid bits"} 
    set mask [expr {$mask ? $mask : (1 << $bits) - 1}] 
    set procname [lindex [info level 0] 0] 
    return [concat \ 
     [$procname [expr {$number >> $bits}] $bits $mask] \ 
     [format %#x [expr {$number & $mask}]] \ 
    ] 
} 
関連する問題