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”
u1 を u ビット左シフトします。
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”
N は u の切り捨て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 ビット右に回転します。