NB: lo scopo di questa domanda è capire meglio gli operatori bitwise di Perl. Sono a conoscenza dei modi per calcolare il numero U descritto di seguito.Espressione per l'impostazione di n bit più bassi che funziona anche quando n è uguale alla dimensione della parola
Lascia che $i
sia un numero intero non negativo. Sto cercando una semplice espressione E<$i>
che valuterà al unsigned intU, la cui $i
bit più bassi sono tutti 1, e il cui bit rimanenti sono tutti 0 di. Per esempio. E<8>
dovrebbe essere 255. In particolare, se $i
uguale dimensione della parola della macchina (W), E<$i>
deve essere uguale ~0
.
Le espressioni (1 << $i) - 1
e ~(~0 << $i)
entrambi fare la cosa giusta, se non quando $i
uguale W, nel qual caso entrambi assumono valore 0
, piuttosto che ~0
.
Sto cercando un modo per farlo che non richiede il calcolo W prima.
EDIT: OK, ho pensato di un brutto, arrancando soluzione
$i < 1 ? 0 : do { my $j = 1 << $i - 1; $j < $j << 1 ? ($j << 1) - 1 : ~0 }
o
$i < 1 ? 0 : (1 << ($i - 1)) < (1 << $i) ? (1 << $i) - 1 : ~0
(anche impraticabile, naturalmente.) Sto usando la notazione strana E<$i>
come abbreviazione di "espressione basata su $i
".
Non ho una forte preferenza al momento per quanto E<$i>
dovrebbe valutare quando $i
è strettamente maggiore di W.
"lo scopo di questa domanda è quello di capire meglio gli operatori bitwise di Perl." Se vuoi veramente capirli, dovresti vedere come sono implementati: vedi 'pp_left_shift' in [pp.c] (https://github.com/Perl/perl5/blob/maint-5.22/pp.C# L1918). 'pp_left_shift' usa semplicemente l'operatore di spostamento a sinistra di C; in C, è un comportamento indefinito spostare un valore per il numero di bit che contiene, motivo per cui penso che '(1 << $ i) - 1' e' ~ (~ 0 << $ i) 'falliscono. – ThisSuitIsBlackNot
'E 'una notazione strana per' f ($ i) ' – ikegami
@ikegami: è perché la mia intenzione era * precisamente di evitare * notazione funzionale, dal momento che * sarebbe stato invariabilmente * erroneamente interpretato come la mia richiesta di un' sub ', mentre stavo chiedendo un'espressione. Certamente, 'E <$i>' * è * una funzione di '$ i', nel senso più generale/matematico del termine, ma se avessi usato' E ($ i) ', la maggior parte, se non tutte, le risposte Sarei diventato della forma 'sub E {...}', e questo non è * quello che sto cercando. – kjo