program main implicit none integer :: i do i=1,12 print *,i,log2d(i),log2u(i) end do contains integer function log2d (n) integer, intent(in) :: n log2d = bit_size(n) - 1 - leadz(n) end function log2d integer function log2u (n) integer, intent(in) :: n log2u = bit_size(n) - leadz(n-1) end function log2u end program main
function log2d(n: uint32): integer; var temp: uint32; begin Result := 0; temp := 1; while (temp < n) do begin Inc(Result); temp := 1 shl Result; end; if (temp > n) then Dec(Result); end; function log2u(n: uint32): integer; begin Result := log2d(n); if (1 shl Result < n) then Inc(Result); end; var i: integer; begin for i := 1 to 16 do writeln(i,': log2d = ',log2d(i),', log2u = ',log2u(i)); end.