Niels wrote:
> Hi,
>
> I have a problem I can solve with some loops and if-thens, but I'm sure it
> can be done with bit operations -- that would be prettier. I've tried to
> work it out on paper, but I keep missing the final solution. Maybe I'm
> missing something obvious...
>
> The problem: A function tries to update an existing value, but is only
> allowed to write certain bits.
>
> There are 3 variables:
> A: the existing value, eg. 10110101
> B: what the function wants to write, eg. 01011100
> C: which bits the function is allowed to write, eg. 00001111
>
> With these examples, 10111100 should be written.
My brain needs a crutch when trying doing this kind of thing
(normally I only write hex number literally when dealing with bitwise stuff -
the conversion stuff still makes my head spin) - this is what this table is for:
128 64 32 16 8 4 2 1
1 0 1 1 0 1 0 1
0 1 0 1 1 1 0 0
0 0 0 0 1 1 1 1
and then I did this - hopefully it shows what you can/have to do:
<?php
// set some values
$oldval = 128 + 32 + 16 + 4 + 1; // 10110101
$update = 64 + 16 + 8 + 4; // 01011100
$mask = 8 + 4 + 2 + 1; // 00001111
// do a 'bit' of surgery ...
$add = $mask & $update;
$keep = ~$mask & $oldval;
$newval = $keep | $add;
// show what happened
var_dump(
str_pad(base_convert($oldval, 10, 2), 8, "0"),
str_pad(base_convert($update, 10, 2), 8, "0"),
str_pad(base_convert($mask, 10, 2), 8, "0"),
str_pad(base_convert($add, 10, 2), 8, "0"),
str_pad(base_convert($keep, 10, 2), 8, "0"),
str_pad(base_convert($newval, 10, 2), 8, "0")
);
?>
>
> How do I combine A, B and C to get that result?
>
>
> Thanks,
> Niels
>
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php