function print_bits(int $value, int $width): void {
for ($i = $width - 1; $i >= 0; $i--) {
$mask = 1 << $i;
echo ($value & $mask) ? '1' : '0';
}
}
function exact_bit_set(int $pos1, int $pos2, int $value): bool {
// Validate bit positions
if ($pos1 < 0 || $pos2 < 0 || $pos1 >= 64 || $pos2 >= 64) {
return false;
}
if ($pos1 === $pos2) {
return false;
}
$mask = (1 << $pos1) | (1 << $pos2);
return $value === $mask;
}
$tests = [
['value' => 0b1000010000, 'x' => 4, 'y' => 9, 'width' => 10],
['value' => 0b0010000010, 'x' => 1, 'y' => 7, 'width' => 10],
['value' => 0b0000100100, 'x' => 2, 'y' => 5, 'width' => 10],
['value' => 0b1000010000, 'x' => 3, 'y' => 9, 'width' => 10],
['value' => 0b1001010000, 'x' => 4, 'y' => 9, 'width' => 10],
['value' => 0b1111111111, 'x' => 4, 'y' => 9, 'width' => 10],
['value' => 0b0000000000, 'x' => 4, 'y' => 9, 'width' => 10],
['value' => 0b1000010000, 'x' => 4, 'y' => 8, 'width' => 10],
['value' => 1, 'x' => 0, 'y' => 0, 'width' => 1],
['value' => 1, 'x' => 0, 'y' => 1, 'width' => 1],
['value' => 0, 'x' => 1, 'y' => 1, 'width' => 1],
];
foreach ($tests as $t) {
print_bits($t['value'], $t['width']);
echo " bits({$t['x']}, {$t['y']}) -> ";
echo exact_bit_set($t['x'], $t['y'], $t['value']) ? "true\n" : "false\n";
}
/*
OUTPUT:
1000010000 bits(4, 9) -> true
0010000010 bits(1, 7) -> true
0000100100 bits(2, 5) -> true
1000010000 bits(3, 9) -> false
1001010000 bits(4, 9) -> false
1111111111 bits(4, 9) -> false
0000000000 bits(4, 9) -> false
1000010000 bits(4, 8) -> false
1 bits(0, 0) -> false
1 bits(0, 1) -> false
0 bits(1, 1) -> false
*/