Chess-Plisco
view release on metacpan or search on metacpan
t/02bit-twiddling.t view on Meta::CPAN
#! /usr/bin/env perl
# Copyright (C) 2021-2025 Guido Flohr <guido.flohr@cantanea.com>,
# all rights reserved.
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What the Fuck You Want
# to Public License, Version 2, as published by Sam Hocevar. See
# http://www.wtfpl.net/ for more details.
use strict;
use integer;
use Test::More tests => 35;
use Chess::Plisco qw(:all);
# Macros from Chess::Plisco::Macro are already expanded here!
my ($bitboard, $count);
$bitboard = 0x88;
{ my $_b = $bitboard; for ($count = 0; $_b; ++$count) { $_b &= $_b - 1; } };
is $count, 2, 'popcount 0x88';
is $bitboard, 0x88, 'popcount 0x88';
$bitboard = 0xffff_ffff_ffff_ffff;
{ my $_b = $bitboard; for ($count = 0; $_b; ++$count) { $_b &= $_b - 1; } };
is $count, 64, 'popcount 0xffff_ffff_ffff_ffff';
is $bitboard, 0xffff_ffff_ffff_ffff, 'popcount 0xffff_ffff_ffff_ffff';
$bitboard = 0x1;
is((($bitboard) & -($bitboard)), 0x1,
"cp_bitboard_clear_but_least_set($bitboard)");
$bitboard = 0x3;
is((($bitboard) & -($bitboard)), 0x1,
"cp_bitboard_clear_but_least_set($bitboard)");
$bitboard = 0x7;
is((($bitboard) & -($bitboard)), 0x1,
"cp_bitboard_clear_but_least_set($bitboard)");
$bitboard = 0xf;
is((($bitboard) & -($bitboard)), 0x1,
"cp_bitboard_clear_but_least_set($bitboard)");
$bitboard = 0x7fff_ffff_ffff_ffff;
is((($bitboard) & -($bitboard)), 0x1,
"cp_bitboard_clear_but_least_set($bitboard)");
$bitboard = 0x8fff_ffff_ffff_ffff;
is((($bitboard) & -($bitboard)), 0x1,
"cp_bitboard_clear_but_least_set($bitboard)");
$bitboard = 0xffff_ffff_ffff_ffff;
is((($bitboard) & -($bitboard)), 0x1,
"cp_bitboard_clear_but_least_set($bitboard)");
$bitboard = 0x2;
is((do { my $A = $bitboard - 1 - ((($bitboard - 1) >> 1) & 0x5555_5555_5555_5555); my $C = ($A & 0x3333_3333_3333_3333) + (($A >> 2) & 0x3333_3333_3333_3333); my $n = $C + ($C >> 32); $n = ($n & 0x0f0f0f0f) + (($n >> 4) & 0x0f0f0f0f); $n = ($n & 0xff...
"cp_bitboard_count_isolated_trailing_zbits($bitboard)");
$bitboard = 0x8000;
is((do { my $A = $bitboard - 1 - ((($bitboard - 1) >> 1) & 0x5555_5555_5555_5555); my $C = ($A & 0x3333_3333_3333_3333) + (($A >> 2) & 0x3333_3333_3333_3333); my $n = $C + ($C >> 32); $n = ($n & 0x0f0f0f0f) + (($n >> 4) & 0x0f0f0f0f); $n = ($n & 0xff...
"cp_bitboard_count_isolated_trailing_zbits($bitboard)");
$bitboard = 0x8000_0000_0000_0000;
is((do { my $A = $bitboard - 1 - ((($bitboard - 1) >> 1) & 0x5555_5555_5555_5555); my $C = ($A & 0x3333_3333_3333_3333) + (($A >> 2) & 0x3333_3333_3333_3333); my $n = $C + ($C >> 32); $n = ($n & 0x0f0f0f0f) + (($n >> 4) & 0x0f0f0f0f); $n = ($n & 0xff...
"cp_bitboard_count_isolated_trailing_zbits($bitboard)");
$bitboard = 0x1;
is((do { my $A = $bitboard - 1 - ((($bitboard - 1) >> 1) & 0x5555_5555_5555_5555); my $C = ($A & 0x3333_3333_3333_3333) + (($A >> 2) & 0x3333_3333_3333_3333); my $n = $C + ($C >> 32); $n = ($n & 0x0f0f0f0f) + (($n >> 4) & 0x0f0f0f0f); $n = ($n & 0xff...
"cp_bitboard_count_isolated_trailing_zbits($bitboard)");
$bitboard = 0x3;
is((($bitboard) & (($bitboard) - 1)), 0x2,
"cp_bitboard_clear_least_set($bitboard)");
( run in 0.398 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )