Find first and last set bit of a long integer: Difference between revisions

Added XPL0 example.
(Added XPL0 example.)
 
(3 intermediate revisions by 2 users not shown)
Line 1,923:
23731861809918778839625988256328912896 │ 12 │ 124 │ 10001110110101001011100011111110101101101100001101011011001001101111110110111011000001001000010001101000010010001000000000000
─────────────────────────────────────────┴──────┴──────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
</pre>
 
=={{header|RPL}}==
≪ → n
≪ '''IF''' n #0 == '''THEN''' -1 '''ELSE'''
0 #1
'''WHILE''' n OVER AND #0 == '''REPEAT''' SL SWAP 1 + SWAP '''END'''
DROP '''END'''
≫ ≫ '<span style="color:blue">LWB</span>' STO
≪ → n
≪ '''IF''' n #0 == '''THEN''' -1 '''ELSE'''
63 #1 RR
'''WHILE''' n OVER AND #0 == '''REPEAT''' SR SWAP 1 - SWAP '''END'''
DROP '''END'''
≫ ≫ '<span style="color:blue">UPB</span>' STO
 
≪ { } 0 5 '''FOR''' j 42 j ^ R→B DUP <span style="color:blue">UPB</span> SWAP <span style="color:blue">LWB</span> R→C + '''NEXT''' ≫ EVAL
{{out}}
<pre>
1: { (0,0) (5,1) (10,2) (16,3) (21,4) (26,5) }
</pre>
 
Line 2,122 ⟶ 2,143:
{{libheader|Wren-big}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="ecmascriptwren">import "./big" for BigInt
import "./fmt" for Fmt
 
var rupb = Fn.new { |x| (x is BigInt) ? x.bitLength - 1 : x.log2.floor }
Line 2,160 ⟶ 2,181:
1302^5 = 3,741,579,015,304,032 rupb: 51 rlwb: 5
1302^6 = 4,871,535,877,925,849,664 rupb: 62 rlwb: 6
</pre>
 
=={{header|XPL0}}==
<syntaxhighlight lang "XPL0">include xpllib; \for Print
 
func UpB(N); \Return position of highest set bit
int N, C;
[C:= 0;
if N & $FFFF0000 then [C:= C+16; N:= N & $FFFF0000];
if N & $FF00FF00 then [C:= C+ 8; N:= N & $FF00FF00];
if N & $F0F0F0F0 then [C:= C+ 4; N:= N & $F0F0F0F0];
if N & $CCCCCCCC then [C:= C+ 2; N:= N & $CCCCCCCC];
if N & $AAAAAAAA then [C:= C+ 1];
return C;
];
 
func LwB(N); \Return position of lowest set bit
int N;
return UpB(N & -N);
 
int N, I;
[Print(" MSB LSB\n");
N:= 1;
for I:= 0 to 5 do
[Print("%10d %3d %3d\n", N, UpB(N), LwB(N));
N:= N*42;
];
]</syntaxhighlight>
{{out}}
<pre>
MSB LSB
1 0 0
42 5 1
1764 10 2
74088 16 3
3111696 21 4
130691232 26 5
</pre>
 
295

edits