Re: Help with some clever bit operations

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux