Next: , Previous: , Up: Arithmetic   [Contents][Index]


6.5.6 Bitwise operations

and ( w1 w2 – w ) core “and”
or ( w1 w2 – w ) core “or”
xor ( w1 w2 – w ) core “x-or”
invert ( w1 – w2 ) core “invert”
mux ( u1 u2 u3 – u ) gforth-1.0 “mux”

multiplex(多重化): u3 の各ビットについて、 そのビットが 1 の場合は u1 から対応するビットを選択し、 それ以外の場合は u2 から対応するビットを選択します。 たとえば、 %0011 %1100 %1010 mux%0110 となります。

lshift ( u1 u – u2 ) core “l-shift”

u1u ビット左シフトします。

rshift ( u1 u – u2 ) core “r-shift”

u1 (セル) を u ビットだけ右にシフトし、 シフトインされたビットを 0 で埋めます(論理/符号無しシフトです)。

arshift ( n1 u – n2 ) gforth-1.0 “ar-shift”

n1 (セル) を u ビット右にシフトし、n1 の符号ビットからシフトインされたビットを埋めます (算術シフト)。

dlshift ( ud1 u – ud2 ) gforth-1.0 “dlshift”

ud1 (2倍長セル) を u ビット左にシフトします。

drshift ( ud1 u – ud2 ) gforth-1.0 “drshift”

ud1 (2倍長セル) を u ビットだけ右にシフトし、 シフトインされたビットを 0 で埋めます (論理/符号なしシフト)。

darshift ( d1 u – d2 ) gforth-1.0 “darshift”

d1 (2倍長セル) を u ビット右にシフトし、d1 の符号ビットからシフトインされたビットで埋めます (算術シフト)。

2* ( n1 – n2 ) core “two-star”

1 つ左にシフトします。符号なしの数値でも機能します

2/ ( n1 – n2 ) core “two-slash”

1 つ右に算術シフトします。 符号付き数値の場合、 これは 2 による floored division になります(/ は必ずしも floors ではないことに注意してください)。

d2* ( d1 – d2 ) double “d-two-star”

2倍長セルを左に 1 シフトします。 符号なしの数値でも機能します

d2/ ( d1 – d2 ) double “d-two-slash”

1 つ右に算術シフトします。 符号付き数値の場合、これは 2 による floored division になります。

>pow2 ( u1 – u2 ) gforth-1.0 “to-pow2”

u2 は、u2>=u1 の最小の 2 のべき乗数です。

log2 ( u – n ) gforth-1.0 “log2”

Nu の切り捨て2進対数、 つまり最初に設定されたビットのインデックスです。 u=0 の場合は n=-1 です。

pow2? ( u – f  ) gforth-1.0 “pow-two-query”

f は、 u が 2 の累乗の場合、 つまり u のビットが 1 つだけセットされている場合に true になります。

ctz ( x – u  ) gforth-1.0 “c-t-z”

x の2進数表現で末尾からのゼロの数を数える

他のほとんどの操作とは異なり、 幅の狭いユニットのローテートと幅の広いユニットのローテートを簡単に合成することはできないため、 1倍長セル幅および 2倍幅のセル幅のローテート操作を使用すると、 結果がセル幅に依存することになります。 公開されたアルゴリズムまたはセル幅に依存しない結果の場合、 通常は固定幅のローテート操作を使用する必要があります。

wrol ( u1 u – u2 ) gforth-1.0 “wrol”

u1 の下位側 16 ビットを u ビットだけ左に回転し、 他のビットを 0 にセットします。

wror ( u1 u – u2 ) gforth-1.0 “wror”

u1 の下位側 16 ビットを u ビットだけ右回転し、 他のビットを 0 にセットします。

lrol ( u1 u – u2 ) gforth-1.0 “lrol”

u1 の下位側 32 ビットを u ビットだけ左に回転し、 他のビットを 0 にセットします。

lror ( u1 u – u2 ) gforth-1.0 “lror”

u1 の下位側 32 ビットを u ビットだけ右回転し、 他のビットを 0 にセットします。

rol ( u1 u – u2 ) gforth-1.0 “rol”

u1 のすべてのビットを u ビットだけ左に回転します。

ror ( u1 u – u2 ) gforth-1.0 “ror”

u1 のすべてのビットを u ビットだけ右回転します。

drol ( ud1 u – ud2 ) gforth-1.0 “drol”

ud1 (2倍長セル) のすべてのビットを u ビットだけ左に回転します。

dror ( ud1 u – ud2 ) gforth-1.0 “dror”

ud1 (2倍長セル) のすべてのビットを u ビット右に回転します。


Next: Numeric comparison, Previous: Two-stage integer division, Up: Arithmetic   [Contents][Index]