How to check whether only 2 bits in a number at a specific position are on (edge‑case‑safe) with PHP

1 Answer

0 votes
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
   
*/

 



answered Apr 3 by avibootz

Related questions

...