skip to Main Content

Operations on bits.
How to take 2 bits from byte like this:
take first 2 from 12345678 = 12;
Make new byte = 00000012

For example as asked in discussion by jspit :

$char = 'z'; //is 122, 0111 1010
$b = $char & '?'; // ? is 63, 0011 1111
echo $b; //$b becomes 58 and shows ':'
//if integer used you get:
$b = $char & 63;// 63 is 0011 1111 as '?' but $char is string and you get 0 result:
echo $b; //$b becomes 0 because conversion to integer is used from string and $char becomes 0 and get 0 & 63 = 0, and here is error.

For clearance operation is on bits not on bytes, but bits from bytes.
‘string’ >> 1 not work, but this is second problem.

Codes of char You can check on my site generating safe readable tokens, with byte template option on. Site is in all available languages.

I think I found good answer here:
how to bitwise shift a string in php?

PS. Sorry I cant vote yours fine answers but I have no points reputation here to do this ;)…

2

Answers


  1. I hope you understand bits can only be 0 or 1, I’m assuming when you say "12345678" you’re just using those decimal symbols to represent the positions of each bit. If that is the case, then you’re looking for bitwise operators.

    More specifically:

    $new = $old >> 6;
    

    This bitwise shift operation will shift all bits 6 positions to the right, discarding the 6 bits that were there before.

    You can also use an or operation with a bitmask to ensure only 2 bits remain, in case the variable had more than 8 bits set:

    $new = ($old >> 6) | 0b00000011;
    
    Login or Signup to reply.
  2. function highestBitsOfByte(int $byte, int $count = 2):int {
       if($count < 0 OR $count > 8) return false;  //Error
       return ($byte & 0xFF) >> (8-$count); 
    }
    
    $input = 0b10011110;
    
    $r = highestBitsOfByte($input,2);
    
    echo sprintf('%08b',$r);
    

    The integer number is limited to the lowest 8 bits with & 0xFF. Then the bits are shifted to the right according to the desired length.

    example to try: https://3v4l.org/1lAvO

    If there is a character as input and the fixed number of 2 bits is required, then this can be used:

    $chr = 'z';  //0111 1010
    
    $hBits = ord($chr) >> 6;
    
    echo sprintf('%08b',$hBits);  //00000001
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search