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

Added XPL0 example.
m (→‎{{header|Sidef}}: Fix link: Perl 6 --> Raku)
(Added XPL0 example.)
 
(37 intermediate revisions by 16 users not shown)
Line 39:
=={{header|11l}}==
 
<langsyntaxhighlight lang="11l">L(i) 6
V x = Int(42 ^ i)
print(‘#10 MSB: #2 LSB: #2’.format(x, bsr(x), bsf(x)))
Line 45:
L(i) 6
V x = Int64(1302 ^ i)
print(‘#20 MSB: #2 LSB: #2’.format(x, bsr(x), bsf(x)))</langsyntaxhighlight>
 
{{out}}
Line 62:
3741579015304032 MSB: 51 LSB: 5
</pre>
 
=={{header|Ada}}==
<syntaxhighlight lang="ada">with Ada.Text_IO;
with Ada.Integer_Text_IO;
with Ada.Unchecked_Conversion;
 
procedure Find_Last_Bit is
 
type My_Integer is range -2**63 .. 2**63 - 1;
 
procedure Find_Set_Bits (Value : in My_Integer;
MSB_Bit : out Integer;
LSB_Bit : out Integer)
is
type Bit_Field is array (0 .. My_Integer'Size - 1) of Boolean;
pragma Pack (Bit_Field);
for Bit_Field'Size use My_Integer'Size;
 
function To_Field is
new Ada.Unchecked_Conversion (My_Integer, Bit_Field);
 
Field : constant Bit_Field := To_Field (Value);
begin
 
LSB_Bit := -1;
MSB_Bit := -1;
 
for Bit in Field'Range loop
if Field (Bit) then
LSB_Bit := Bit;
exit;
end if;
end loop;
 
for Bit in reverse Field'Range loop
if Field (Bit) then
MSB_Bit := Bit;
exit;
end if;
end loop;
end Find_Set_Bits;
 
 
procedure Put_Result (Value : in My_Integer) is
package My_Integer_IO is
new Ada.Text_IO.Integer_IO (My_Integer);
use Ada.Text_IO;
use Ada.Integer_Text_IO;
Use My_Integer_IO;
 
LSB_Bit, MSB_Bit : Integer;
Placeholder : String := " MSB XX LSB YY";
Image_MSB : String renames Placeholder ( 6 .. 7);
Image_LSB : String renames Placeholder (13 .. 14);
begin
Find_Set_Bits (Value,
MSB_Bit => MSB_Bit,
LSB_Bit => LSB_Bit);
Put (Value, Width => 18);
Put (Value, Width => 66, Base => 2);
Put (Image_MSB, MSB_Bit);
Put (Image_LSB, LSB_Bit);
Put_Line (Placeholder);
end Put_Result;
 
begin
Put_Result (Value => 0);
for A in 0 .. 11 loop
Put_Result (Value => 42 ** A);
end loop;
end Find_Last_Bit;</syntaxhighlight>
{{out}}
<pre>
0 2#0# MSB -1 LSB -1
1 2#1# MSB 0 LSB 0
42 2#101010# MSB 5 LSB 1
1764 2#11011100100# MSB 10 LSB 2
74088 2#10010000101101000# MSB 16 LSB 3
3111696 2#1011110111101100010000# MSB 21 LSB 4
130691232 2#111110010100011000010100000# MSB 26 LSB 5
5489031744 2#101000111001010111111101001000000# MSB 32 LSB 6
230539333248 2#11010110101101001101110000111010000000# MSB 37 LSB 7
9682651996416 2#10001100111001101011000010000110000100000000# MSB 43 LSB 8
406671383849472 2#1011100011101110110001111010111111110101000000000# MSB 48 LSB 9
17080198121677824 2#111100101011100101100110000101101111000110010000000000# MSB 53 LSB 10
717368321110468608 2#100111110100100110101010111111110000111010000110100000000000# MSB 59 LSB 11</pre>
 
=={{header|ALGOL 68}}==
Line 67 ⟶ 153:
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-2.3.5 algol68g-2.3.5].}}
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of '''format'''[ted] ''transput''.}}
'''File: Template.Find_first_and_last_set_bit.a68'''<langsyntaxhighlight lang="algol68">INT lbits width = UPB []BOOL(LBITS(2r0));
 
OP LWB = (BITS in x)INT: bits width - RUPB in x;
Line 145 ⟶ 231:
# WHILE # out bit /= 2r0 DO SKIP OD;
ABS out # EXIT #
FI;</langsyntaxhighlight>'''File: test.Find_first_and_last_set_bit.a68'''<langsyntaxhighlight lang="algol68">#!/usr/local/bin/a68g --script #
 
MODE LBITS = LONG BITS;
Line 189 ⟶ 275:
prod *:= zoom
OD
)</syntaxhighlight>
)</lang>'''Output:'''
{{out}}
<pre>
INT: find first & last set bit |RLWB|RUPB|Bits
Line 215 ⟶ 302:
18227236413148063624904752885045248| 11 |113 |111000001010101100000100010100010101100000011011010011001110101111101110010001100000011001010001101001100000000000
</pre>
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="arturo">msb: function [x]-> dec size as.binary x
lsb: function [x]-> msb and x neg x
 
loop 0..5 'i [
x: 42 ^ i
print [pad to :string x 10 "-->" "MSB:" pad.right to :string (msb x) 2 "- LSB:" lsb x]
]
 
print ""
 
loop 0..5 'i [
x: 1302 ^ i
print [pad to :string x 17 "-->" "MSB:" pad.right to :string (msb x) 2 "- LSB:" lsb x]
]</syntaxhighlight>
 
{{out}}
 
<pre> 1 --> MSB: 0 - LSB: 0
42 --> MSB: 5 - LSB: 1
1764 --> MSB: 10 - LSB: 2
74088 --> MSB: 16 - LSB: 3
3111696 --> MSB: 21 - LSB: 4
130691232 --> MSB: 26 - LSB: 5
 
1 --> MSB: 0 - LSB: 0
1302 --> MSB: 10 - LSB: 1
1695204 --> MSB: 20 - LSB: 2
2207155608 --> MSB: 31 - LSB: 3
2873716601616 --> MSB: 41 - LSB: 4
3741579015304032 --> MSB: 51 - LSB: 5</pre>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">loop, 12{
First := Last := ""
n:=42**(A_Index-1)
Line 225 ⟶ 345:
Res .= 42 "^" A_Index-1 " --> First : " First " , Last : " Last "`n"
}
MsgBox % Res</langsyntaxhighlight>
{{out}}
Outputs:<pre>42^0 --> First : 0 , Last : 0
<pre>42^0 --> First : 0 , Last : 0
42^1 --> First : 1 , Last : 5
42^2 --> First : 2 , Last : 10
Line 239 ⟶ 360:
42^11 --> First : 11 , Last : 59</pre>
 
=={{header|CBASIC256}}==
<syntaxhighlight lang="basic256">print "INT: find first & last set bit"
p = 1
for j = 0 to 5
print rjust(p,9); " "; rjust(ToBinary(p),29,0); " MSB: "; rjust(MSB(p),2); " LSB: "; rjust(LSB(p),2)
p *= 42
next j
print
end
 
function MSB(i)
return length(ToBinary(i))-1
end function
 
function LSB(i)
<lang c>#include <stdio.h>
return (i & -i)
end function
</syntaxhighlight>
{{out}}
<pre>
INT: find first & last set bit
1 00000000000000000000000000001 MSB: 0 LSB: 1
42 00000000000000000000000101010 MSB: 5 LSB: 2
1764 00000000000000000011011100100 MSB: 10 LSB: 4
74088 00000000000010010000101101000 MSB: 16 LSB: 8
3111696 00000001011110111101100010000 MSB: 21 LSB: 16
130691232 00111110010100011000010100000 MSB: 26 LSB: 32
</pre>
 
 
=={{header|C}}==
<syntaxhighlight lang="c">#include <stdio.h>
#include <stdint.h>
 
Line 288 ⟶ 437:
 
return 0;
}</syntaxhighlight>
}</lang>output ("x###" are in base 16)
{{out}}
<pre>
42**0 = 1(x00000001): M x00000001( 0) L x001( 0)
Line 297 ⟶ 447:
42**5 = 130691232(x07ca30a0): M x04000000(26) L x020( 5)
</pre>
Where "x###" are in base 16
 
===GCC extension===
{{works with|GCC}}
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <limits.h>
 
Line 349 ⟶ 500:
 
return 0;
}</syntaxhighlight>
}</lang>output ("x###" are in base 16)
{{out}}
<pre>
int:
Line 372 ⟶ 524:
42**11 = 717368321110468608(x09f49aaff0e86800): M 59 L 11
</pre>
Where "x###" are in base 16
 
=={{header|D}}==
(This task is not complete, the second part will be added later.)
<langsyntaxhighlight lang="d">import std.stdio, core.bitop, std.bigint;
 
void main() {
Line 386 ⟶ 539:
x, size_t.sizeof * 8, x, bsr(x), bsf(x));
}
}</langsyntaxhighlight>
{{out}}
On a 32 bit system:
Line 409 ⟶ 562:
17080198121677824 0000000000111100101011100101100110000101101111000110010000000000 MSB: 53 LSB: 10
717368321110468608 0000100111110100100110101010111111110000111010000110100000000000 MSB: 59 LSB: 11</pre>
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{libheader| Velthuis.BigIntegers}} Thanks for Rudy Velthuis for Velthuis.BigIntegers[https://github.com/rvelthuis/DelphiBigNumbers].
<syntaxhighlight lang="delphi">
program Find_first_and_last_set_bit_of_a_long_integer;
 
{$APPTYPE CONSOLE}
 
uses
System.SysUtils,
Velthuis.BigIntegers;
 
function bsf(x: string): Integer;
begin
Result := x.Length - x.LastIndexOf('1') - 1;
end;
 
function bsr(x: string): Integer;
begin
Result := x.Length - x.IndexOf('1') - 1;
end;
 
var
i: integer;
value: BigInteger;
binary: string;
 
begin
for i := 0 to 11 do
begin
value := BigInteger.Pow(42, i);
binary := value.ToBinaryString.PadLeft(64, '0');
 
Writeln(format('%18s %60s MSB: %2d LSB: %2d', [value.ToString, binary, bsr(binary),
bsf(binary)]));
end;
 
readln;
end.</syntaxhighlight>
{{out}}
<pre> 1 0000000000000000000000000000000000000000000000000000000000000001 MSB: 0 LSB: 0
42 0000000000000000000000000000000000000000000000000000000000101010 MSB: 5 LSB: 1
1764 0000000000000000000000000000000000000000000000000000011011100100 MSB: 10 LSB: 2
74088 0000000000000000000000000000000000000000000000010010000101101000 MSB: 16 LSB: 3
3111696 0000000000000000000000000000000000000000001011110111101100010000 MSB: 21 LSB: 4
130691232 0000000000000000000000000000000000000111110010100011000010100000 MSB: 26 LSB: 5
5489031744 0000000000000000000000000000000101000111001010111111101001000000 MSB: 32 LSB: 6
230539333248 0000000000000000000000000011010110101101001101110000111010000000 MSB: 37 LSB: 7
9682651996416 0000000000000000000010001100111001101011000010000110000100000000 MSB: 43 LSB: 8
406671383849472 0000000000000001011100011101110110001111010111111110101000000000 MSB: 48 LSB: 9
17080198121677824 0000000000111100101011100101100110000101101111000110010000000000 MSB: 53 LSB: 10
717368321110468608 0000100111110100100110101010111111110000111010000110100000000000 MSB: 59 LSB: 11</pre>
 
 
=={{header|Forth}}==
{{works with|gforth|0.7.3}}
 
<syntaxhighlight lang="Forth">: bin. base @ 2 base ! swap u. base ! ;
 
: lwb ( n -- u )
0 swap
begin
dup 1 and 0= while
1 rshift
swap 1+ swap
repeat drop ;
 
: upb ( n -- u )
-1 swap
begin
dup 0<> while
1 rshift
swap 1+ swap
repeat drop ;
 
: Find_first_and_last_set_bit_of_a_long_integer
1 6 0 do
dup dup dup dup
cr 10 .r ." : " ." MSB:" upb 2 .r ." , LSB:" lwb 2 .r ." , %" bin.
42 *
loop drop ;
 
Find_first_and_last_set_bit_of_a_long_integer</syntaxhighlight>
{{out}}
<pre> 1: MSB: 0, LSB: 0, %1
42: MSB: 5, LSB: 1, %101010
1764: MSB:10, LSB: 2, %11011100100
74088: MSB:16, LSB: 3, %10010000101101000
3111696: MSB:21, LSB: 4, %1011110111101100010000
130691232: MSB:26, LSB: 5, %111110010100011000010100000 ok
</pre>
 
 
 
=={{header|Fortran}}==
Since the Fortran 2008 standard, the language has LEADZ and TRAILZ intrinsic functions that yield respectively the number of leading (i.e. HSB) and trailing (LSB) zero bits. This gives an immediate solution to the task.
 
<langsyntaxhighlight lang="fortran">program bits
implicit none
integer :: n = 1, i
Line 421 ⟶ 667:
n = 42 * n
end do
end program</langsyntaxhighlight>
{{out}}
 
<pre>
1 0 0
Line 431 ⟶ 677:
111110010100011000010100000 5 26
</pre>
 
=== By divide and conquer ===
 
Even though Fortran has intrinsic functions, and modern machines have special instructions for the task, it still seems worthwhile to write out functions.
 
One thing that is evident, if you study the various ways to implement these functions, is that Fortran is ill suited, in a way most high-level languages have been ill suited since the beginning of time: they do not have built in ''unsigned'' integers with ''overflow explicitly allowed''. ISO standard C does (and thus so does ATS, because its integers are exactly C integers). But this is unusual, outside of C and its relatives, and (I would imagine) owes to C's origins as a replacement for assembly language.
 
<syntaxhighlight lang="fortran">! As was already pointed out, Fortran has intrinsic functions that
! should compile to efficient code, such as a single machine
! instruction. But it seems profitable to have written implementations
! according to the task description.
 
! Here, by the way, is a page devoted to the topic of finding the LS1B
! and MS1B positions:
! https://www.chessprogramming.org/index.php?title=BitScan&oldid=22495#With_separated_LS1B
 
! I am uncertain what the "lwb" and "upb" are supposed to mean, but I
! imagine it is to isolate the bit. I do this below using
! bit-twiddling methods, *before* doing binary searches to find the
! positions of the bits.
 
module bit_thingies_for_rosetta_code
 
! INT64 is the largest integer kind standardized in ISO_FORTRAN_ENV,
! although 128-bit integers are available with gfortran on AMD64. I
! shall stick with INT64; the principles do not differ.
use, intrinsic :: iso_fortran_env, only: int64
 
implicit none
 
integer(kind = int64), parameter :: most_negative = ishft (1_int64, 63)
 
integer(kind = int64), parameter :: mask1 = &
& int (b'1010101010101010101010101010101010101010101010101010101010101010', &
& kind = int64)
integer(kind = int64), parameter :: mask2 = &
& int (b'1100110011001100110011001100110011001100110011001100110011001100', &
& kind = int64)
integer(kind = int64), parameter :: mask3 = &
& int (b'1111000011110000111100001111000011110000111100001111000011110000', &
& kind = int64)
integer(kind = int64), parameter :: mask4 = &
& int (b'1111111100000000111111110000000011111111000000001111111100000000', &
& kind = int64)
integer(kind = int64), parameter :: mask5 = &
& int (b'1111111111111111000000000000000011111111111111110000000000000000', &
& kind = int64)
integer(kind = int64), parameter :: mask6 = &
& int (b'1111111111111111111111111111111100000000000000000000000000000000', &
& kind = int64)
 
contains
 
! LS1B-position by binary search. This method is MUCH improved by
! first isolating the least significant 1-bit, so I do that. This
! action makes the masks more effective.
elemental function rlwb (n) result (i)
integer(kind = int64), value :: n
integer :: i
 
if (n == most_negative) then
!
! With the most negative two's complement number, one cannot
! trust Fortran to do arithmetic as one intends. Thus this
! branch. (There would be no such problem with *unsigned*
! integers in C; these are required by the standard to overflow
! and underflow freely.)
!
! If you take into account the task's restriction to positive
! integers, then of course this case never occurs, and you can
! leave out the branch.
!
i = 63
else
! Isolate the least significant 1-bit. This method is specific
! for two's complement. Your platform is very unlikely not to
! be two's complement.
n = iand (n, -n)
 
i = 0_int64
if (iand (n, not (mask6)) == 0) i = 32_int64
if (iand (n, not (mask5)) == 0) i = i + 16_int64
if (iand (n, not (mask4)) == 0) i = i + 8_int64
if (iand (n, not (mask3)) == 0) i = i + 4_int64
if (iand (n, not (mask2)) == 0) i = i + 2_int64
if (iand (n, not (mask1)) == 0) i = i + 1_int64
end if
end function rlwb
 
! MS1B-position by binary search. This method is MUCH improved by
! first isolating the most significant 1-bit, so I do that. This
! action makes the masks more effective.
elemental function rupb (n) result (i)
integer(kind = int64), value :: n
integer :: i
 
if (ibits (n, 63, 1) /= 0) then
! The task restricts itself to positive integers, but I shall
! do a branch for negative numbers.
i = 0_int64
else if (ibits (n, 62, 1) /= 0) then
! Also, in Fortran one cannot safely add one to every 63-bit
! number, so another special branch.
i = 1_int64
else
! Fill all bits to the right of the MS1B.
n = ior (n, ishft (n, -1))
n = ior (n, ishft (n, -2))
n = ior (n, ishft (n, -4))
n = ior (n, ishft (n, -8))
n = ior (n, ishft (n, -16))
n = ior (n, ishft (n, -32))
 
! Isolate the most significant 1-bit.
n = ishft (n + 1, -1)
 
i = 0_int64
if (iand (n, mask6) /= 0) i = 32_int64
if (iand (n, mask5) /= 0) i = i + 16_int64
if (iand (n, mask4) /= 0) i = i + 8_int64
if (iand (n, mask3) /= 0) i = i + 4_int64
if (iand (n, mask2) /= 0) i = i + 2_int64
if (iand (n, mask1) /= 0) i = i + 1_int64
end if
end function rupb
 
end module bit_thingies_for_rosetta_code
 
program find_set_bits
use, intrinsic :: iso_fortran_env, only: int64
use, non_intrinsic :: bit_thingies_for_rosetta_code
implicit none
 
integer :: i
integer(kind = int64) :: n
 
write (*, '(A70)') "Using intrinsic functions TRAILZ and LEADZ"
n = 1_int64
do i = 0, 11
write (*, '(B0.64, 2(" ", I2))') n, trailz (n), 63 - leadz (n)
n = 42_int64 * n
end do
 
write (*, '()')
 
write (*, '(A70)') "Using binary search"
n = 1_int64
do i = 0, 11
write (*, '(B0.64, 2(" ", I2))') n, rlwb (n), rupb (n)
n = 42_int64 * n
end do
 
end program find_set_bits</syntaxhighlight>
 
{{out}}
<pre>$ gfortran -std=f2018 find_set_bits.f90 && ./a.out
Using intrinsic functions TRAILZ and LEADZ
0000000000000000000000000000000000000000000000000000000000000001 0 0
0000000000000000000000000000000000000000000000000000000000101010 1 5
0000000000000000000000000000000000000000000000000000011011100100 2 10
0000000000000000000000000000000000000000000000010010000101101000 3 16
0000000000000000000000000000000000000000001011110111101100010000 4 21
0000000000000000000000000000000000000111110010100011000010100000 5 26
0000000000000000000000000000000101000111001010111111101001000000 6 32
0000000000000000000000000011010110101101001101110000111010000000 7 37
0000000000000000000010001100111001101011000010000110000100000000 8 43
0000000000000001011100011101110110001111010111111110101000000000 9 48
0000000000111100101011100101100110000101101111000110010000000000 10 53
0000100111110100100110101010111111110000111010000110100000000000 11 59
 
Using binary search
0000000000000000000000000000000000000000000000000000000000000001 0 0
0000000000000000000000000000000000000000000000000000000000101010 1 5
0000000000000000000000000000000000000000000000000000011011100100 2 10
0000000000000000000000000000000000000000000000010010000101101000 3 16
0000000000000000000000000000000000000000001011110111101100010000 4 21
0000000000000000000000000000000000000111110010100011000010100000 5 26
0000000000000000000000000000000101000111001010111111101001000000 6 32
0000000000000000000000000011010110101101001101110000111010000000 7 37
0000000000000000000010001100111001101011000010000110000100000000 8 43
0000000000000001011100011101110110001111010111111110101000000000 9 48
0000000000111100101011100101100110000101101111000110010000000000 10 53
0000100111110100100110101010111111110000111010000110100000000000 11 59</pre>
 
=={{header|FreeBASIC}}==
{{trans|Python}}
<syntaxhighlight lang="freebasic">Function MSB(i As Integer) As Integer
Return Len(Bin(i))-1
End Function
 
Function LSB(i As Integer) As Integer
Return MSB(i And -i)
End Function
 
Dim As Integer p = 1
For j As Integer = 0 To 11
Print Using "################## & MSB: ## LSB: ##"; p; Bin(p,64); MSB(p); LSB(p)
p *= 42
Next j
Sleep</syntaxhighlight>
{{out}}
<pre>
1 0000000000000000000000000000000000000000000000000000000000000001 MSB: 0 LSB: 0
42 0000000000000000000000000000000000000000000000000000000000101010 MSB: 5 LSB: 1
1764 0000000000000000000000000000000000000000000000000000011011100100 MSB: 10 LSB: 2
74088 0000000000000000000000000000000000000000000000010010000101101000 MSB: 16 LSB: 3
3111696 0000000000000000000000000000000000000000001011110111101100010000 MSB: 21 LSB: 4
130691232 0000000000000000000000000000000000000111110010100011000010100000 MSB: 26 LSB: 5
5489031744 0000000000000000000000000000000101000111001010111111101001000000 MSB: 32 LSB: 6
230539333248 0000000000000000000000000011010110101101001101110000111010000000 MSB: 37 LSB: 7
9682651996416 0000000000000000000010001100111001101011000010000110000100000000 MSB: 43 LSB: 8
406671383849472 0000000000000001011100011101110110001111010111111110101000000000 MSB: 48 LSB: 9
17080198121677824 0000000000111100101011100101100110000101101111000110010000000000 MSB: 53 LSB: 10
717368321110468608 0000100111110100100110101010111111110000111010000110100000000000 MSB: 59 LSB: 11
</pre>
 
 
=={{header|FutureBasic}}==
<syntaxhighlight lang="futurebasic">
local fn IntegerToBinaryStr( x as NSInteger ) as CFStringRef
CFStringRef resultStr = @""
while ( x )
resultStr = fn StringByAppendingString( fn StringWithFormat( @"%lu", x && 1 ), resultStr )
x = x >> 1
wend
end fn = resultStr
 
local fn FirstAndLastBit
NSInteger i, p = 1
for i = 0 to 11
CFStringRef binaryStr = fn IntegerToBinaryStr(p)
printf @"%20lld %-62s MSB: %2lld LSB: %2lld", p, fn StringUTF8String( binaryStr ), len( binaryStr ) - 1, i
p = p * 42
next
end fn
 
fn FirstAndLastBit
 
HandleEvents
 
</syntaxhighlight>
{{output}
<pre>
1 1 MSB: 0 LSB: 0
42 101010 MSB: 5 LSB: 1
1764 11011100100 MSB: 10 LSB: 2
74088 10010000101101000 MSB: 16 LSB: 3
3111696 1011110111101100010000 MSB: 21 LSB: 4
130691232 111110010100011000010100000 MSB: 26 LSB: 5
5489031744 101000111001010111111101001000000 MSB: 32 LSB: 6
230539333248 11010110101101001101110000111010000000 MSB: 37 LSB: 7
9682651996416 10001100111001101011000010000110000100000000 MSB: 43 LSB: 8
406671383849472 1011100011101110110001111010111111110101000000000 MSB: 48 LSB: 9
17080198121677824 111100101011100101100110000101101111000110010000000000 MSB: 53 LSB: 10
717368321110468608 100111110100100110101010111111110000111010000110100000000000 MSB: 59 LSB: 11
</pre>
 
 
 
=={{header|Go}}==
{{trans|ALGOL 68}}
<langsyntaxhighlight lang="go">package main
 
import (
Line 569 ⟶ 1,073:
n.Mul(n, base)
}
}</langsyntaxhighlight>
{{out}}
<pre>
Line 608 ⟶ 1,112:
Instead of this, to meet the spirit of the task, these lsb and msb routines are generalized to reduce the integer in blocks of bits and then zoom in on the desired bit by binary search (i.e. successively looking a blocks that are half the size again). The exponent for the initial power used to create the masks does not need to be itself a power of two. The xsb_initial procedure uses introspection to determine the word size of a basic integer type. This is used to build a mask that fits within the basic word size of the implementation. In this way we won't create unnecessary large integers through implicit type conversions.
 
<langsyntaxhighlight Iconlang="icon">link printf,hexcvt
 
procedure main()
Line 666 ⟶ 1,170:
}
return mask # return pre-built data
end</langsyntaxhighlight>
 
{{libheader|Icon Programming Library}}
Line 672 ⟶ 1,176:
[http://www.cs.arizona.edu/icon/library/src/procs/hexcvt.icn hexcvt.icn provides hexstring]
 
{{out}}
Output:<pre>42^0 = 1 (x00000001) : MSB=0 LSB=0
<pre>42^0 = 1 (x00000001) : MSB=0 LSB=0
42^1 = 42 (x0000002A) : MSB=5 LSB=1
42^2 = 1764 (x000006E4) : MSB=10 LSB=2
Line 690 ⟶ 1,195:
Implementation:
 
<langsyntaxhighlight lang="j">lwb=: 0:
upb=: (#: i: 1:)"0
rlwb=: #@#:"0 - 1:
rupb=: rlwb - upb</langsyntaxhighlight>
 
Notes:
Line 703 ⟶ 1,208:
lwb is the required name for the index of "first set bit in a binary value". This is always zero here. Here's why:
 
<langsyntaxhighlight Jlang="j"> #: 7
1 1 1
#: 8
Line 712 ⟶ 1,217:
1 1 0 0 0 1 0 1 0 1
#:123456789123456789123456789x
1 1 0 0 1 1 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 1 1 0 0 0 1 0 1 0 1</langsyntaxhighlight>
 
The the first '''set''' bit in J's binary representation for a positive integer is always the first bit of that integer (there's an exception for zero, because it has no first set bit, but that's outside the domain of this task). That said, note that this would not hold for an arbitrary integer in a list of integers. But bit representations of lists of integers is outside the scope of this task.
Line 720 ⟶ 1,225:
Example use:
 
<langsyntaxhighlight lang="j"> (,.lwb,.upb,.rlwb,.rupb) <.i.@>.&.(42&^.) 2^64
1 0 0 0 0
42 0 4 5 1
Line 747 ⟶ 1,252:
13999413527763489727269395457024 0 93 103 10
18227236413148063624904752885045248 0 102 113 11
23731861809918778839625988256328912896 0 112 124 12</langsyntaxhighlight>
 
Note, in the above sentences, the rightmost part of each sentence is about generating an arbitrary sequence of values. The phrase <.i.@>.&.(42&^.) 2^64 generates the sequence 1 42 1764 74088 3111696 130691232 ... and the phrase i.@x:@>.&.(1302&^.) 2^128 generates the sequence 1 1302 1695204 2207155608 ...
Line 755 ⟶ 1,260:
=={{header|Java}}==
 
=== Library ===
{{incorrect|Java}}
{{works with|Java|1.5+}}
Notes:
* least significant bit is bit 0 (such that bit ''i'' always has value 2<sup>i</sup>, and the result is independent of integer type width)
* when the integer 0 is given, mssb() and lssb() both return no bits set; mssb_idx() and lssb_idx() will return -1 and the integer type width, respectively
<lang java>public class FirstLastBits {
 
<syntaxhighlight lang="java">public class FirstAndLastBits {
// most significant set bit
public static int mssb(int x) {
return Integer.highestOneBit(x);
}
 
public static long mssbLSB(longLong xaNumber) {
if ( aNumber <= 0 ) {
return Long.highestOneBit(x);
throw new IllegalArgumentException("Number must be positive");
}
}
return Long.numberOfTrailingZeros(aNumber);
}
public static long MSB(Long aNumber) {
if ( aNumber <= 0 ) {
throw new IllegalArgumentException("Number must be positive");
}
return 63 - Long.numberOfLeadingZeros(aNumber);
}
public static long LSB(BigInteger aNumber) {
if ( aNumber.signum() <= 0 ) {
throw new IllegalArgumentException("Number must be positive");
}
return aNumber.getLowestSetBit();
}
public static long MSB(BigInteger aNumber) {
if ( aNumber.signum() <= 0 ) {
throw new IllegalArgumentException("Number must be positive");
}
return aNumber.bitLength() - 1;
}
public static void main(String[] aArgs) {
Long powerOf42 = 1L;
for ( int i = 0; i <= 11; i++ ) {
System.out.print(String.format("%-5s%-3s%s", "42 ^ ", i, " = "));
System.out.print(String.format("%1$" + 64 + "s", Long.toBinaryString(powerOf42)).replace(" ", "0"));
System.out.println(String.format("%s%-2s%s%-2s", " -> LSB: ", LSB(powerOf42), ", MSB: ", MSB(powerOf42)));
powerOf42 *= 42;
}
System.out.println();
BigInteger bigInteger1302 = BigInteger.valueOf(1302);
BigInteger powerOf1302 = BigInteger.ONE;
for ( int i = 0; i <= 6; i++ ) {
System.out.print(String.format("%-7s%s%s", "1302 ^ ", i, " = "));
System.out.print(String.format("%1$" + 64 + "s", powerOf1302.toString(2)).replace(" ", "0"));
String line = String.format("%s%-2s%s%-2s", " -> LSB: ", LSB(powerOf1302), ", MSB: ", MSB(powerOf1302));
System.out.println(line);
powerOf1302 = powerOf1302.multiply(bigInteger1302);
}
}
 
}</syntaxhighlight>
public static int mssb_idx(int x) {
{{out}}
return Integer.SIZE - 1 - Integer.numberOfLeadingZeros(x);
}
 
public static int mssb_idx(long x) {
return Long.SIZE - 1 - Long.numberOfLeadingZeros(x);
}
 
public static int mssb_idx(BigInteger x) {
return x.bitLength() - 1;
}
 
// least significant set bit
public static int lssb(int x) {
return Integer.lowestOneBit(x);
}
 
public static long lssb(long x) {
return Long.lowestOneBit(x);
}
 
public static int lssb_idx(int x) {
return Integer.numberOfTrailingZeros(x);
}
 
public static int lssb_idx(long x) {
return Long.numberOfTrailingZeros(x);
}
 
public static int lssb_idx(BigInteger x) {
return x.getLowestSetBit();
}
 
public static void main(String[] args) {
System.out.println("int:");
int n1 = 1;
for (int i = 0; ; i++, n1 *= 42) {
System.out.printf("42**%d = %10d(x%08x): M x%08x(%2d) L x%03x(%2d)\n",
i, n1, n1,
mssb(n1), mssb_idx(n1),
lssb(n1), lssb_idx(n1));
if (n1 >= Integer.MAX_VALUE / 42)
break;
}
System.out.println();
System.out.println("long:");
long n2 = 1;
for (int i = 0; ; i++, n2 *= 42) {
System.out.printf("42**%02d = %20d(x%016x): M x%016x(%2d) L x%06x(%2d)\n",
i, n2, n2,
mssb(n2), mssb_idx(n2),
lssb(n2), lssb_idx(n2));
if (n2 >= Long.MAX_VALUE / 42)
break;
}
System.out.println();
System.out.println("BigInteger:");
BigInteger n3 = BigInteger.ONE;
BigInteger k = BigInteger.valueOf(1302);
for (int i = 0; i < 10; i++, n3 = n3.multiply(k)) {
System.out.printf("1302**%02d = %30d(x%28x): M %2d L %2d\n",
i, n3, n3,
mssb_idx(n3),
lssb_idx(n3));
}
}
}</lang>
output:
<pre>
42 ^ 0 = 0000000000000000000000000000000000000000000000000000000000000001 -> LSB: 0 , MSB: 0
int:
42 ^ 1 = 0000000000000000000000000000000000000000000000000000000000101010 -> LSB: 1 , MSB: 5
42**0 = 1(x00000001): M x00000001( 0) L x001( 0)
42 ^ 2 = 0000000000000000000000000000000000000000000000000000011011100100 -> LSB: 2 , MSB: 10
42**1 = 42(x0000002a): M x00000020( 5) L x002( 1)
42 ^ 3 = 0000000000000000000000000000000000000000000000010010000101101000 -> LSB: 3 , MSB: 16
42**2 = 1764(x000006e4): M x00000400(10) L x004( 2)
42 ^ 4 = 0000000000000000000000000000000000000000001011110111101100010000 -> LSB: 4 , MSB: 21
42**3 = 74088(x00012168): M x00010000(16) L x008( 3)
42 ^ 5 = 0000000000000000000000000000000000000111110010100011000010100000 -> LSB: 5 , MSB: 26
42**4 = 3111696(x002f7b10): M x00200000(21) L x010( 4)
42 ^ 6 = 0000000000000000000000000000000101000111001010111111101001000000 -> LSB: 6 , MSB: 32
42**5 = 130691232(x07ca30a0): M x04000000(26) L x020( 5)
42 ^ 7 = 0000000000000000000000000011010110101101001101110000111010000000 -> LSB: 7 , MSB: 37
 
42 ^ 8 = 0000000000000000000010001100111001101011000010000110000100000000 -> LSB: 8 , MSB: 43
long:
42 ^ 9 = 0000000000000001011100011101110110001111010111111110101000000000 -> LSB: 9 , MSB: 48
42**00 = 1(x0000000000000001): M x0000000000000001( 0) L x000001( 0)
42 ^ 10 = 0000000000111100101011100101100110000101101111000110010000000000 -> LSB: 10, MSB: 53
42**01 = 42(x000000000000002a): M x0000000000000020( 5) L x000002( 1)
42 ^ 11 = 0000100111110100100110101010111111110000111010000110100000000000 -> LSB: 11, MSB: 59
42**02 = 1764(x00000000000006e4): M x0000000000000400(10) L x000004( 2)
42**03 = 74088(x0000000000012168): M x0000000000010000(16) L x000008( 3)
42**04 = 3111696(x00000000002f7b10): M x0000000000200000(21) L x000010( 4)
42**05 = 130691232(x0000000007ca30a0): M x0000000004000000(26) L x000020( 5)
42**06 = 5489031744(x00000001472bfa40): M x0000000100000000(32) L x000040( 6)
42**07 = 230539333248(x00000035ad370e80): M x0000002000000000(37) L x000080( 7)
42**08 = 9682651996416(x000008ce6b086100): M x0000080000000000(43) L x000100( 8)
42**09 = 406671383849472(x000171dd8f5fea00): M x0001000000000000(48) L x000200( 9)
42**10 = 17080198121677824(x003cae5985bc6400): M x0020000000000000(53) L x000400(10)
42**11 = 717368321110468608(x09f49aaff0e86800): M x0800000000000000(59) L x000800(11)
 
1302 ^ 0 = 0000000000000000000000000000000000000000000000000000000000000001 -> LSB: 0 , MSB: 0
BigInteger:
1302 ^ 1 = 0000000000000000000000000000000000000000000000000000010100010110 -> LSB: 1 , MSB: 10
1302**00 = 1(x 1): M 0 L 0
1302 ^ 2 = 0000000000000000000000000000000000000000000110011101110111100100 -> LSB: 2 , MSB: 20
1302**01 = 1302(x 516): M 10 L 1
1302 ^ 3 = 0000000000000000000000000000000010000011100011101000010110011000 -> LSB: 3 , MSB: 31
1302**02 = 1695204(x 19dde4): M 20 L 2
1302 ^ 4 = 0000000000000000000000101001110100010110110110110111001100010000 -> LSB: 4 , MSB: 41
1302**03 = 2207155608(x 838e8598): M 31 L 3
1302 ^ 5 = 0000000000001101010010101111001001000000000110110011001101100000 -> LSB: 5 , MSB: 51
1302**04 = 2873716601616(x 29d16db7310): M 41 L 4
1302 ^ 6 = 0100001110011011001011000001001000001010010101110100101001000000 -> LSB: 6 , MSB: 62
1302**05 = 3741579015304032(x d4af2401b3360): M 51 L 5
1302**06 = 4871535877925849664(x 439b2c120a574a40): M 62 L 6
1302**07 = 6342739713059456262528(x 157d73223c097f3a180): M 72 L 7
1302**08 = 8258247106403412053811456(x 6d4c07901d584d1176100): M 82 L 8
1302**09 = 10752237732537242494062515712(x 22be0ae76f53f17f6ce75600): M 93 L 9
</pre>
 
Line 880 ⟶ 1,342:
 
'''Module''':
<langsyntaxhighlight lang="julia">module Bits
 
export lwb, upb
Line 887 ⟶ 1,349:
upb(n) = 8 * sizeof(n) - leading_zeros(n) - 1
 
end # module Bits</langsyntaxhighlight>
 
'''Main''':
<langsyntaxhighlight lang="julia">using Main.Bits
 
# Using the built-in functions `leading_zeros` and `trailing_zeros`
Line 903 ⟶ 1,365:
for n in int128"1302" .^ (0:11)
@printf(" %-40i | %-3i | %-3i\n", n, lwb(n), upb(n))
end</langsyntaxhighlight>
 
{{out}}
Line 938 ⟶ 1,400:
=={{header|Kotlin}}==
As I have no idea what the difference is supposed to be between lwb/uwb and rlwb/ruwb (unless the former numbers bits from left to right), I have only provided implementations of the latter - using Java/Kotlin library functions - which seem to be all that is needed in any case to perform the task in hand:
<langsyntaxhighlight lang="scala">// version 1.1.0
 
import java.math.BigInteger
Line 966 ⟶ 1,428:
for (i in 0..11) {
print("42 ^ ${i.toString().padEnd(2)} = ${pow42.toString(2).padStart(64, '0').padEnd(64)} -> ")
println(String.format("MSB: %2d, LSB: %2d", .format(pow42.ruwb(), pow42.rlwb()))
pow42 *= 42L
}
Line 974 ⟶ 1,436:
for (i in 0..6) {
print("1302 ^ $i = ${pow1302.toString(2).padStart(64, '0').padEnd(64)} -> ")
println(String.format("MSB: %2d, LSB: %2d", .format(pow1302.ruwb(), pow1302.rlwb()))
pow1302 *= big1302
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,004 ⟶ 1,466:
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">MSB[n_]:=BitLength[n]-1
LSB[n_]:=IntegerExponent[n,2]</langsyntaxhighlight>
 
<pre>Map[{#,"MSB:",MSB[#],"LSB:",LSB[#]}&,
Line 1,025 ⟶ 1,487:
=={{header|PARI/GP}}==
This version uses PARI. These work on arbitrary-length integers; the implementation for wordsize integers would be identical to [[#C|C's]].
<langsyntaxhighlight lang="c">long
msb(GEN n)
{
Line 1,035 ⟶ 1,497:
{
return vali(n);
}</langsyntaxhighlight>
 
This version uses GP. It works on arbitrary-length integers; GP cannot directly work on wordsize integers except in a <code>vecsmall</code>.
<langsyntaxhighlight lang="parigp">lsb(n)=valuation(n,2);
msb(n)=#binary(n)-1;</langsyntaxhighlight>
 
=={{header|Perl}}==
This is simple and works with both native and bigint numbers.
<langsyntaxhighlight lang="perl">sub msb {
my ($n, $base) = (shift, 0);
$base++ while $n >>= 1;
Line 1,051 ⟶ 1,513:
my $n = shift;
msb($n & -$n);
}</langsyntaxhighlight>
With large bigints, this is much faster (while as_bin seems expensive, every Math::BigInt transaction has large overhead, so Perl ops on the binary string ends up being a huge win vs. anything doing shifts, ands, compares, etc.). If we want one function to work on both types, we could easily modify this to make a Math::BigInt object if the input isn't already one.
<langsyntaxhighlight lang="perl">sub bi_msb { # Input should be a Math::BigInt object
length(shift->as_bin)-3;
}</langsyntaxhighlight>
With native ints, this meets the task description assuming a 64-bit Perl:
<langsyntaxhighlight lang="perl">sub msb64 {
my($n, $pos) = (shift, 0);
die "n must be a 64-bit integer)" if $n > ~0;
Line 1,068 ⟶ 1,530:
if (($n & 0x8000000000000000) == 0) { $pos += 1; $n <<= 1; }
63-$pos;
}</langsyntaxhighlight>
 
=={{header|Phix}}==
=== machine-sized integers ===
There is nothing like this already built in, so we will roll our own, in low-level assembly. Of course you would normally hide this sort of stuff out of sight, far away from the usual day-to-day code.<br>
Of course you would normally hide this sort of stuff out of sight, far away from the usual day-to-day code.
<lang Phix>function msb(integer i)
<!--<syntaxhighlight lang="phix">-->
#ilASM{
<span style="color: #008080;">without</span> <span style="color: #008080;">javascript_semantics</span>
[32]
<span style="color: #008080;">function</span> <span style="color: #000000;">msb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
mov eax,[i]
#ilASM{
bsr ecx,eax
mov [i32],ecx
mov eax,[64i]
mov raxbsr ecx,[i]eax
bsr rcxmov [i],raxecx
mov [i64],rcx
} mov rax,[i]
bsr rcx,rax
return i
mov [i],rcx
end function
}
 
<span style="color: #008080;">return</span> <span style="color: #000000;">i</span>
function lsb(integer i)
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
#ilASM{
[32]
<span style="color: #008080;">function</span> <span style="color: #000000;">lsb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
mov eax,[i]
#ilASM{
bsf ecx,eax -- (requires 0.8.0+)
mov [i32],ecx
mov eax,[64i]
mov raxbsf ecx,[i]eax
bsf rcxmov [i],raxecx
mov [i64],rcx
} mov rax,[i]
bsf rcx,rax
return i
mov [i],rcx
end function
}
 
<span style="color: #008080;">return</span> <span style="color: #000000;">i</span>
atom p = 1
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
for i=0 to 11 do
printf(1,"%18d %064b MSB:%2d LSB: %2d\n",{p,p,msb(p),lsb(p)})
<span style="color: #004080;">atom</span> <span style="color: #000000;">p</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
p *= 42
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">11</span> <span style="color: #008080;">do</span>
if not integer(p) then exit end if
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%18d %064b MSB:%2d LSB: %2d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">p</span><span style="color: #0000FF;">,</span><span style="color: #000000;">p</span><span style="color: #0000FF;">,</span><span style="color: #000000;">msb</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">),</span><span style="color: #000000;">lsb</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">)})</span>
end for</lang>
<span style="color: #000000;">p</span> <span style="color: #0000FF;">*=</span> <span style="color: #000000;">42</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #004080;">integer</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 1,122 ⟶ 1,588:
717368321110468608 0000100111110100100110101010111111110000111010000110100000000000 MSB:59 LSB: 11
</pre>
On 32-bit the table stops at msb of 26. Since this task is specifically looking for bsf/bsr it is explicitly tagged as incompatible with pwa/p2js<br>
Aside: power(42,5) [and above] are implemented on the FPU using fyl2x, f2xm1, and fscale;
on 64-bit that results in 130691232 + ~7.3e-12 rather than the integer 130691232 exactly,
Line 1,128 ⟶ 1,594:
 
=== mpfr/gmp ===
{{libheader|Phix/mpfr}}
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>include mpfr.e -- 0.8.0+
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
 
<span style="color: #008080;">include</span> <span style="color: #004080;">mpfr</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
function rupbz(mpz n)
integer res = mpz_sizeinbase(n,2)
<span style="color: #008080;">function</span> <span style="color: #000000;">rupbz</span><span style="color: #0000FF;">(</span><span style="color: #004080;">mpz</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
while res!=0 and mpz_tstbit(n,res)=0 do
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_sizeinbase</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
res -= 1
<span style="color: #008080;">while</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">and</span> <span style="color: #7060A8;">mpz_tstbit</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">do</span>
end while
<span style="color: #000000;">res</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
return res
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
end function
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function rlwbz(mpz n)
return mpz_scan1(n,0)
<span style="color: #008080;">function</span> <span style="color: #000000;">rlwbz</span><span style="color: #0000FF;">(</span><span style="color: #004080;">mpz</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
end function
<span style="color: #008080;">return</span> <span style="color: #7060A8;">mpz_scan1</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
mpz n = mpz_init(1)
for i = 0 to 12 do
<span style="color: #004080;">mpz</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
printf(1,"1302^%02d %38s %5d %5d\n", {i,mpz_get_str(n), rupbz(n), rlwbz(n)})
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">12</span> <span style="color: #008080;">do</span>
mpz_mul_si(n,n,1302)
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"1302^%02d %38s %5d %5d\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">mpz_get_str</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">rupbz</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">rlwbz</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)})</span>
end for</lang>
<span style="color: #7060A8;">mpz_mul_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1302</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 1,164 ⟶ 1,633:
1302^12 23731861809918778839625988256328912896 124 12
</pre>
In my tests the while loop in rupbz() always iterated precisely once, suggesting it merely converts a 1-based bit count to a 0-based bit number and could be replaced by -1<br>
Note that under pwa/p2js this will quietly perform the very kind of looping the task specifically asks not for, but at least it works, and it does not do that under desktop/Phix.
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de msb (N)
(dec (length (bin (abs N)))) )
 
(de lsb (N)
(length (stem (chop (bin N)) "1")) )</langsyntaxhighlight>
Test:
<langsyntaxhighlight PicoLisplang="picolisp">(for N (1 42 717368321110468608 291733167875766667063796853374976)
(tab (33 6 6) N (lsb N) (msb N)) )</langsyntaxhighlight>
{{out}}
Output:
<pre> 1 0 0
42 1 5
Line 1,183 ⟶ 1,653:
=={{header|Python}}==
{{works with|Python|2.7+ and 3.1+}}
<langsyntaxhighlight lang="python">def msb(x):
return x.bit_length() - 1
 
Line 1,195 ⟶ 1,665:
for i in range(6):
x = 1302 ** i
print("%20d MSB: %2d LSB: %2d" % (x, msb(x), lsb(x)))</langsyntaxhighlight>
{{out}}
<pre>
Line 1,211 ⟶ 1,681:
3741579015304032 MSB: 51 LSB: 5
</pre>
 
=={{header|Quackery}}==
 
Quackery numbers are BigInts.
 
<code>lsb</code> returns <code>-1</code> if passed <code>0</code>, which has no bits set.
 
<code>msb</code> returns <code>-1</code> if passed a negative number, which has no highest set bit, or <code>0</code>, which has no bits set.
 
The reverse functions <code>rlwb</code> and <code>rupb</code> are not meaningful for BigInts as they do not have a rightmost bit. (Well, they do because memory is finite, but the size limit is not fixed.)
 
<syntaxhighlight lang="Quackery"> [ dup 0 = iff
[ 1 - ] done
0 swap
[ dup 1 & not while
dip 1+
1 >>
again ]
drop ] is lsb ( n --> n )
 
[ -1 swap
[ dup 1 < not while
dip 1+
1 >>
again ]
drop ] is msb ( n --> n )
 
6 times
[ 42 i^ ** dup echo
say " msb:"
dup msb echo
say " lsb:"
lsb echo cr ]
cr
6 times
[ 1302 i^ ** dup echo
say " msb:"
dup msb echo
say " lsb:"
lsb echo cr ]</syntaxhighlight>
 
{{out}}
 
<pre>1 msb:0 lsb:0
42 msb:5 lsb:1
1764 msb:10 lsb:2
74088 msb:16 lsb:3
3111696 msb:21 lsb:4
130691232 msb:26 lsb:5
 
1 msb:0 lsb:0
1302 msb:10 lsb:1
1695204 msb:20 lsb:2
2207155608 msb:31 lsb:3
2873716601616 msb:41 lsb:4
3741579015304032 msb:51 lsb:5</pre>
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">
#lang racket
(require rnrs/arithmetic/bitwise-6)
Line 1,219 ⟶ 1,745:
(define x (expt 42 n))
(list n (bitwise-first-bit-set x) (- (integer-length x) 1)))
</syntaxhighlight>
</lang>
{{out}}
Output:
<langsyntaxhighlight lang="racket">
'((0 0 0)
(1 1 5)
Line 1,242 ⟶ 1,768:
(18 18 97)
(19 19 102))
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
 
Perl 6 integers are arbitrary sized, and the lsb and msb methods are built-in.
Raku integers are arbitrary sized, and the lsb and msb methods are built-in.
<lang perl6>sub table ($base,$power) {
<syntaxhighlight lang="raku" line>sub table ($base,$power) {
my $digits = ($base ** $power).chars;
printf "%{$digits}s lsb msb\n", 'number';
Line 1,257 ⟶ 1,784:
 
table 42, 20;
table 1302, 20;</langsyntaxhighlight>
{{out}}
<pre> number lsb msb
Line 1,305 ⟶ 1,832:
 
=={{header|REXX}}==
Programming note: &nbsp; The task's requirements state to compute powers of &nbsp; 1302 &nbsp; up the host's next "natural" &nbsp; '''long''' &nbsp; host word
<br>size ···, &nbsp; but for REXX, the "natural" size is a character string (indeed, the only thing REXX knows are character strings, numbers
<br>are expressed as character strings), &nbsp; so the output (below) was limited to four times the default size, &nbsp; but the actual limit(practical) may be
<br>limit may be around eight million bytes (for some REXXes). &nbsp; REXX programmers have no need to know what the host's word size is.
<lang rexx>/*REXX program finds the first and last set bit of "integer" and "long interger". */
do cycle=1 for 2; w=digits() /*W: is used for a nice display. */
base=word(42 1302,cycle) /*pick an integer for this cycle. */
call sep '─┬─' /*this is part of the separator. */
say center(base'**n',w) '│' center('rlwb',4) '│' centre('rupb',4) '│ bits'
call sep '─┼─' /*this is part of the separator. */
do j=-1 /*traipse through all the bits. */
if j==-1 then x=0
else x=base**j
if pos('E', x)\==0 then leave /*does it have an exponent? */
say right(x,w) '│' right(rlwb(x),4) '│' right(rupb(x),4) '│' bits
end /*j*/
call sep '─┴─' /*this is part of the separator. */
say; say; say; say; numeric digits digits() * 4
end /*cycle*/ /* [↑] this quadruples DIGITS.*/
exit /*stick a fork in it, we're done.*/
/*──────────────────────────────────subroutines─────────────────────────────────────────────*/
n2b: bits=word(strip(x2b(d2x(arg(1))),'L',0) 0,1); return bits
rlwb: arg n;call n2b n; if n==0 then return 0; return length(n2b(n))-length(strip(bits,'T',0))
rupb: arg n;call n2b n; if n==0 then return -1; return length(n2b(n))-1
sep: say copies('─',w)arg(1)copies('─',4)arg(1)copies('─',4)arg(1) ||,
copies('─',length(n2b(10**(digits()-1)))); return</lang>
'''output'''
<pre>
──────────┬──────┬──────┬────────────────────────────
42**n │ rlwb │ rupb │ bits
──────────┼──────┼──────┼────────────────────────────
0 │ 0 │ -1 │ 0
1 │ 0 │ 0 │ 1
42 │ 1 │ 5 │ 101010
1764 │ 2 │ 10 │ 11011100100
74088 │ 3 │ 16 │ 10010000101101000
3111696 │ 4 │ 21 │ 1011110111101100010000
130691232 │ 5 │ 26 │ 111110010100011000010100000
──────────┴──────┴──────┴────────────────────────────
 
REXX programmers have no need to know what the host's word size is, &nbsp; as it is irrelevant.
 
A fair amount of coding was added to align and/or center the displaying of the numbers for the output.
<syntaxhighlight lang="rexx">/*REXX program finds the first and last set bit of "integer" and "long integer". */
parse arg digs . /*obtain optional argument from the CL.*/
if digs=='' | digs=="," then digs= 40 /*Not specified? Then use the default.*/
numeric digits max(9, digs); d= digits() /*maybe use more precision for this run*/
@= '─'; @4= copies(@, 4) /*build parts of the separator line. */
!= '│' /* " part " " output " */
do cycle=1 for 2
base= word(42 1302, cycle) /*pick an integer for this cycle. */
@d= copies(@, d) /*build part of the separator line. */
call sep '─┬─' /* ─┬─ is part of the separator line.*/
say center(base'**n (decimal)', d) ! center("rlwb", 4) ! center('rupb', 4) !,
right(base"**n (binary)" , d+5) /*display the title for the output. */
call sep '─┼─' /* ─┼─ is part of the separator line.*/
do j=-1 /*traipse through all the bits. */
if j==-1 then x= 0 /*special handle the first time through*/
else x= base**j /*compute a power of BASE. */
if pos('E', x)>0 then leave /*does it have an exponent? */
say right(x, d) ! right(rlwb(x), 4) ! right(rupb(x), 4) ! bits
end /*j*/
call sep '─┴─' /* ─┴─ is part of the separator line.*/
if cycle==1 then do 3; say; end /*show extra blank lines between sets. */
end /*cycle*/
exit 0 /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
n2b: bits= word( strip( x2b( d2x( arg(1))), 'L', 0) 0, 1); L= length(bits); return bits
rlwb: arg #; call n2b #; if #==0 then return 0; return L - length( strip( bits, 'T', 0))
rupb: arg #; call n2b #; if #==0 then return -1; return L - 1
sep: arg _; say @d || _ || @4 || _ || @4 || _ || copies(@, length( n2b(10**d) )); return</syntaxhighlight>
{{out|output|text=&nbsp; when using the internal default inputs:}}
 
(Shown at &nbsp; <big>'''<sup>3</sup>/<sub>4</sub>'''</big> &nbsp; size.)
<pre style="font-size:75%">
─────────────────────────────────────────┬──────┬──────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
42**n (decimal) │ rlwb │ rupb │ 42**n (binary)
─────────────────────────────────────────┼──────┼──────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
0 │ 0 │ -1 │ 0
1 │ 0 │ 0 │ 1
42 │ 1 │ 5 │ 101010
1764 │ 2 │ 10 │ 11011100100
74088 │ 3 │ 16 │ 10010000101101000
3111696 │ 4 │ 21 │ 1011110111101100010000
130691232 │ 5 │ 26 │ 111110010100011000010100000
5489031744 │ 6 │ 32 │ 101000111001010111111101001000000
230539333248 │ 7 │ 37 │ 11010110101101001101110000111010000000
9682651996416 │ 8 │ 43 │ 10001100111001101011000010000110000100000000
406671383849472 │ 9 │ 48 │ 1011100011101110110001111010111111110101000000000
17080198121677824 │ 10 │ 53 │ 111100101011100101100110000101101111000110010000000000
717368321110468608 │ 11 │ 59 │ 100111110100100110101010111111110000111010000110100000000000
30129469486639681536 │ 12 │ 64 │ 11010001000100001011000001101110110000110001000010001000000000000
1265437718438866624512 │ 13 │ 70 │ 10001001001100101111001111001000101100000000001011011001010000000000000
53148384174432398229504 │ 14 │ 75 │ 1011010000010010110111111111011101100111000000111011110100100100000000000000
2232232135326160725639168 │ 15 │ 80 │ 111011000101100011000101111101001011011100110100111010000011111101000000000000000
93753749683698750476845056 │ 16 │ 86 │ 100110110001101001000001111010001001100000111010101110000110100110000010000000000000000
3937657486715347520027492352 │ 17 │ 91 │ 11001011100100100111011010000001010001111100110100010010000010100111101010100000000000000000
165381614442044595841154678784 │ 18 │ 97 │ 10000101100110000001110111000100110101110001111010010011110101101110000001111001000000000000000000
6946027806565873025328496508928 │ 19 │ 102 │ 1010111101010111101001110001001001011010010110000010001000001010000001101001111011010000000000000000000
291733167875766667063796853374976 │ 20 │ 107 │ 111001100010001100001011010010000001011010010011101011001010110100101000101100000111000100000000000000000000
12252793050782200016679467841748992 │ 21 │ 113 │ 100101110000011011111111011001110100111011010000111010010101000110100010101100111100101000101000000000000000000000
514617308132852400700537649353457664 │ 22 │ 118 │ 11000110001110010010111100110111100101110111001000110010001110110010010110001011111110010101010010000000000000000000000
21613926941579800829422581272845221888 │ 23 │ 124 │ 10000010000101011000011011111100011110110110001011110000111101101101000010100011110110111001111101110100000000000000000000000
907784931546351634835748413459499319296 │ 24 │ 129 │ 1010101010111100010000010010101101100001111100011101110001000011111100011101011100010000010000010100100001000000000000000000000000
─────────────────────────────────────────┴──────┴──────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 
─────────────────────────────────────┬──────┬──────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1302**n │ rlwb │ rupb │ bits
─────────────────────────────────────┼──────┼──────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
0 │ 0 │ -1 │ 0
1 │ 0 │ 0 │ 1
1302 │ 1 │ 10 │ 10100010110
1695204 │ 2 │ 20 │ 110011101110111100100
2207155608 │ 3 │ 31 │ 10000011100011101000010110011000
2873716601616 │ 4 │ 41 │ 101001110100010110110110110111001100010000
3741579015304032 │ 5 │ 51 │ 1101010010101111001001000000000110110011001101100000
4871535877925849664 │ 6 │ 62 │ 100001110011011001011000001001000001010010101110100101001000000
6342739713059456262528 │ 7 │ 72 │ 1010101111101011100110010001000111100000010010111111100111010000110000000
8258247106403412053811456 │ 8 │ 82 │ 11011010100110000000111100100000001110101011000010011010001000101110110000100000000
10752237732537242494062515712 │ 9 │ 93 │ 1000101011111000001010111001110110111101010011111100010111111101101100111001110101011000000000
13999413527763489727269395457024 │ 10 │ 103 │ 10110000101100101000101101110101000100000011010011101110001111100001001111100000100011110110010000000000
18227236413148063624904752885045248 │ 11 │ 113 │ 111000001010101100000100010100010101100000011011010011001110101111101110010001100000011001010001101001100000000000
─────────────────────────────────────┴──────┴──────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 
 
─────────────────────────────────────────┬──────┬──────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1302**n (decimal) │ rlwb │ rupb │ 1302**n (binary)
─────────────────────────────────────────┼──────┼──────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
0 │ 0 │ -1 │ 0
1 │ 0 │ 0 │ 1
1302 │ 1 │ 10 │ 10100010110
1695204 │ 2 │ 20 │ 110011101110111100100
2207155608 │ 3 │ 31 │ 10000011100011101000010110011000
2873716601616 │ 4 │ 41 │ 101001110100010110110110110111001100010000
3741579015304032 │ 5 │ 51 │ 1101010010101111001001000000000110110011001101100000
4871535877925849664 │ 6 │ 62 │ 100001110011011001011000001001000001010010101110100101001000000
6342739713059456262528 │ 7 │ 72 │ 1010101111101011100110010001000111100000010010111111100111010000110000000
8258247106403412053811456 │ 8 │ 82 │ 11011010100110000000111100100000001110101011000010011010001000101110110000100000000
10752237732537242494062515712 │ 9 │ 93 │ 1000101011111000001010111001110110111101010011111100010111111101101100111001110101011000000000
13999413527763489727269395457024 │ 10 │ 103 │ 10110000101100101000101101110101000100000011010011101110001111100001001111100000100011110110010000000000
18227236413148063624904752885045248 │ 11 │ 113 │ 111000001010101100000100010100010101100000011011010011001110101111101110010001100000011001010001101001100000000000
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>
 
=={{header|Ruby}}==
{{trans|Python}}
<langsyntaxhighlight lang="ruby">def msb(x)
x.bit_length - 1
end
Line 1,386 ⟶ 1,964:
x = 1302 ** i
puts "%20d MSB: %2d LSB: %2d" % [x, msb(x), lsb(x)]
end</langsyntaxhighlight>
 
{{out}}
Line 1,410 ⟶ 1,988:
most- and least-significant set bit in a binary value expressed in LSB 0 bit numbering.
 
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
include "bigint.s7i";
 
Line 1,441 ⟶ 2,019:
" MSB: " <& rupb(bigNum) lpad 2 <& " LSB: " <& rlwb(bigNum) lpad 2);
end for;
end func;</langsyntaxhighlight>
 
{{out}}
Line 1,466 ⟶ 2,044:
Sidef has arbitrary sized integers.
{{trans|Perl}}
<langsyntaxhighlight lang="ruby">func msb(n) {
var b = 0
while(n >>= 1) { ++b }
Line 1,474 ⟶ 2,052:
func lsb(n) {
msb(n & -n)
}</langsyntaxhighlight>
 
Test cases:
{{trans|Raku}}
<langsyntaxhighlight lang="ruby">func table (base,power) {
var digits = length(base**power)
printf("%#{digits}s lsb msb\n", 'number')
Line 1,488 ⟶ 2,066:
 
table(42, 20)
table(1302, 20)</langsyntaxhighlight>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">proc lwb {x} {
if {$x == 0} {return -1}
set n 0
Line 1,509 ⟶ 2,087:
}
return $n
}</langsyntaxhighlight>
Code to use the above:
<langsyntaxhighlight lang="tcl">package require Tcl 8.6; # For convenient bit string printing
 
proc powsTo {pow bits} {
Line 1,534 ⟶ 2,112:
printPows 42 [powsTo 42 [expr {$tcl_platform(wordSize) * 8}]]
puts "Powers of 1302 up to 128 bits"
printPows 1302 [powsTo 1302 128]</langsyntaxhighlight>
{{out}}
Output:
<pre>
Powers of 42 up to machine word size:
Line 1,561 ⟶ 2,139:
1302**12 = 23731861809918778839625988256328912896 | 12 | 124 | 10001110110101001011100011111110101101101100001101011011001001101111110110111011000001001000010001101000010010001000000000000
</pre>
 
=={{header|Wren}}==
{{libheader|Wren-big}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="wren">import "./big" for BigInt
import "./fmt" for Fmt
 
var rupb = Fn.new { |x| (x is BigInt) ? x.bitLength - 1 : x.log2.floor }
var rlwb = Fn.new { |x| rupb.call(x & -x) }
 
System.print("Powers of 42 below 2^32 using Num:")
var x = 1
for (i in 0..5) {
Fmt.print("42^$d = $,11d rupb: $2d rlwb: $2d", i, x, rupb.call(x), rlwb.call(x))
x = x * 42
}
 
System.print("\nPowers of 1302 below 2^64 using BigInt:")
x = BigInt.new(1)
for (i in 0..6) {
Fmt.print("1302^$d = $,25s rupb: $2s rlwb: $2s", i, x, rupb.call(x), rlwb.call(x))
x = x * 1302
}</syntaxhighlight>
 
{{out}}
<pre>
Powers of 42 below 2^32 using Num:
42^0 = 1 rupb: 0 rlwb: 0
42^1 = 42 rupb: 5 rlwb: 1
42^2 = 1,764 rupb: 10 rlwb: 2
42^3 = 74,088 rupb: 16 rlwb: 3
42^4 = 3,111,696 rupb: 21 rlwb: 4
42^5 = 130,691,232 rupb: 26 rlwb: 5
 
Powers of 1302 below 2^64 using BigInt:
1302^0 = 1 rupb: 0 rlwb: 0
1302^1 = 1,302 rupb: 10 rlwb: 1
1302^2 = 1,695,204 rupb: 20 rlwb: 2
1302^3 = 2,207,155,608 rupb: 31 rlwb: 3
1302^4 = 2,873,716,601,616 rupb: 41 rlwb: 4
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>
 
=={{header|Yabasic}}==
{{trans|FreeBASIC}}
<syntaxhighlight lang="yabasic">print "INT: find first & last set bit"
p = 1
for j = 0 to 5
print p using("##########"), " MSB: ", MSB(p) using("##"), " LSB: ", LSB(p)
p = p * 42
next j
print
end
 
sub MSB(i)
return len(bin$(i))-1
end sub
 
sub LSB(i)
return MSB(and(i,-i))
end sub</syntaxhighlight>
{{out}}
<pre>
INT: find first & last set bit
1 MSB: 0 LSB: 0
42 MSB: 5 LSB: 1
1764 MSB: 10 LSB: 2
74088 MSB: 16 LSB: 3
3111696 MSB: 21 LSB: 4
130691232 MSB: 26 LSB: 5
</pre>
 
 
=={{header|Z80 Assembly}}==
This version works with 8-bit values and is simple enough, given the CPU's obvious affinity for manipulating 8-bit data. First we display the "least" set bit, then the "most" set bit. These are in terms of LSB-0 ordering, e.g. <code>%76543210</code> (where those numbers are bit positions rather than literals)
 
<syntaxhighlight lang="z80">;;;;;;;;;;;;;;;;;;; HEADER ;;;;;;;;;;;;;;;;;;;
read "\SrcCPC\winape_macros.asm"
read "\SrcCPC\MemoryMap.asm"
read "\SrcALL\winapeBuildCompat.asm"
;;;;;;;;;;;;;;;;;;; PROGRAM ;;;;;;;;;;;;;;;;;;;
 
org &1000
ld a,%00101111
push af
call lwb_8
call showhex
call newline
pop af
 
 
 
call upb_8
call showhex
ret
 
 
 
upb_8:
ld b,8
upb_8_again:
or a
rla
jr c,upb_8_done:
djnz upb_8_again
ld a,255 ;failure code
ret
upb_8_done:
dec b
ld a,b
ret
 
lwb_8:
ld bc,&0800 ;ld b,8 ld c,0
lwb_8_again:
or a
rra
jr c,lwb_8_done
inc c
djnz lwb_8_again
ld a,255 ;failure code
ret
lwb_8_done:
ld a,c
ret
 
 
read "\SrcCPC\winape_stringop.asm"
read "\SrcCPC\winape_showhex.asm"</syntaxhighlight>
{{out}}
<pre>00
05</pre>
 
 
=={{header|zkl}}==
{{trans|C}}
This uses the Int method log2 (== MSB position), which returns the log base 2 of self. log2 is implemented with shifts and ors (it is a 5 step loop (for 64 bit ints) which could obviously be unrolled). See http://graphics.stanford.edu/~seander/bithacks.html.
<langsyntaxhighlight lang="zkl">fcn lsb(n){ n.bitAnd(n.bitNot()+1).log2() }
fcn msb(n){ n.log2() }
 
Line 1,573 ⟶ 2,322:
p,n,n, msb(n), lsb(n)));
if (n>=(1).MAX / 42) break;
}</langsyntaxhighlight>
{{out}}
<pre>
295

edits