"Bit manipulation can be tricky," writes Nathan, "especially if you have no familiarity with bitwise operators or logic."
"At least, that's what my smarter-than-built-in-language-features colleague must have thought when he authored setBit. Fortunately, his code was the only one that utilized this function, as it doesn't quite work as advertised."
/*
* setBit($val, $bit, $switch)
*
* This will switch all the bits specified by $bit to on or
* off in $val depending on $switch. So, if $val = 8, and
* $bit = 4, $switch is true, it will turn on the 4 bit,
* and $val will end up being 12; Now, if $val = 12, and $bit
* is 5, if $switch is true, $val will be 13, if false $val
* will be 8. So, all the bits of $bit is turned on or off
*
*/
function setBit($val, $bit, $switch = true) {
$val = (int) $val;
$bit = (int) $bit;
// set some strings that humans would consider false
// but would be converted to true if converted by PHP
if (is_string($switch)) {
switch ($switch) {
case 'false' :
case 'down' :
case 'off' :
case 'not' :
case '0' :
case '' :
$switch = false;
break;
default :
$switch = true;
break;
}
}
if ($switch) { // we are turning the bits on
$newval = $val | $bit; // val OR bit
}
else { // we are turning the bits off
$newval = $val & ( ~ $bit); // val AND ( NOT bit)
}
return $newval;
}