mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 17:34:43 +00:00
69 lines
1.8 KiB
ObjectPascal
69 lines
1.8 KiB
ObjectPascal
//
|
|
//
|
|
// The Nimrod Compiler
|
|
// (c) Copyright 2008 Andreas Rumpf
|
|
//
|
|
// See the file "copying.txt", included in this
|
|
// distribution, for details about the copyright.
|
|
//
|
|
|
|
unit nmath;
|
|
|
|
interface
|
|
|
|
{$include 'config.inc'}
|
|
|
|
{@ignore}
|
|
uses
|
|
nsystem;
|
|
{@emit}
|
|
|
|
function countBits(n: cardinal): int;
|
|
function IsPowerOfTwo(x: int): Boolean;
|
|
function nextPowerOfTwo(x: int): int;
|
|
|
|
implementation
|
|
|
|
function countBits(n: cardinal): int;
|
|
const
|
|
lookup: array [0..255] of Byte = (
|
|
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3,
|
|
2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4,
|
|
2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5,
|
|
4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4,
|
|
3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,
|
|
3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,
|
|
4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6,
|
|
5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
|
|
);
|
|
var
|
|
i: int;
|
|
begin
|
|
result := 0;
|
|
for i := 0 to sizeof(n)-1 do
|
|
Inc(result, lookup[ (n shr (i * 8)) and 255 ])
|
|
end;
|
|
|
|
function IsPowerOfTwo(x: int): Boolean;
|
|
begin
|
|
result := x and -x = x
|
|
end;
|
|
|
|
function nextPowerOfTwo(x: int): int;
|
|
begin
|
|
result := x - 1;
|
|
result := result or (result shr 16);
|
|
result := result or (result shr 8);
|
|
result := result or (result shr 4);
|
|
result := result or (result shr 2);
|
|
result := result or (result shr 1);
|
|
Inc(result)
|
|
end;
|
|
|
|
end.
|