注意:この質問の目的は、Perlのビット演算子をよりよく理解することです。私は数値Uを計算する方法を知っています。nがワードサイズに等しい場合でも動作する最低nビットを設定する式
$i
を負でない整数とします。私は、その$i
最下位ビットがすべて1つのであり、その残りのビットすべて0のあるunsigned int型U、と評価される単純な式E<$i>
を探しています。例えば。 E<8>
は$i
はマシンのワードサイズ(W)に等しい場合、E<$i>
は~0
を等しくする必要があり、具体的には255でなければなりません。
表現(1 << $i) - 1
と~(~0 << $i)
両方が$i
はどちらもむしろ~0
よりも、値0
を取る、その場合には W に等しいとき以外は、正しいことを行います。
私は計算を必要としないこれを行う方法を探していますW最初。
EDIT:(。もちろん、また非現実的)OK、私は解決策
$i < 1 ? 0 : do { my $j = 1 << $i - 1; $j < $j << 1 ? ($j << 1) - 1 : ~0 }
または
$i < 1 ? 0 : (1 << ($i - 1)) < (1 << $i) ? (1 << $i) - 1 : ~0
をplodding、醜い考え
私は奇妙な表記E<$i>
を「表現式$i
」の略語として使用しています。
私は$i
は厳密に W より大きい場合E<$i>
がに評価すべきもののため、現時点で強い好みを持っていません。
"この質問の目的は、Perlのビット演算子をよりよく理解することです。"本当にそれらを理解したいのであれば、それらがどのように実装されているかを見てください:[pp.c]の 'pp_left_shift'(https://github.com/Perl/perl5/blob/maint-5.22/pp.c)を見てください。 #L1918)。 'pp_left_shift'は単にCの左シフト演算子を使います。 Cでは、それが含むビット数で値をシフトするための未定義の振る舞いで、 '(1 << $ i) - 1'と'〜(〜0 << $ i) 'は失敗すると考えられます。 – ThisSuitIsBlackNot
'E <$i>'は 'f($ i)'の奇妙な表記です – ikegami
@ikegami:私の意図は*機能表記を避けることでした。私は表現を求めていました。もちろん、 'E <$i>' *は '$ i'の関数であり、より一般的な/数学的な意味で使われますが、' E($ i) 'を使っていれば、私は 'sub E {...}'という形になっていたでしょう。 – kjo