Re: Help with some clever bit operations
| From: | Niels | Date: | Tue, 13 Jun 2006 11:13:00 +0000 |
| Subject: | Re: Help with some clever bit operations | ||
| References: | 1 2 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-237878@lists.php.net to get a copy of this message | ||
On Tuesday 13 June 2006 12:22, Jochem Maas wrote:
> 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
>>
Thanks, I appreciate your effort! Working code with inlined pun -- very
nice!
Regards,
Niels