Nasıl bir bayt bit tersine çevirmek için?

6 Cevap php

PHP en iyi,

örneğin,

11011111 ==> 11111011

6 Cevap

Yalındır yaklaşım 8 maskeleri, 8 dönerken, 7 ve eklemeler yapmak için:

$blah = $blah & 128 >> 7 + $blah & 64 >> 5 + $blah & 32 >> 3 + $blah & 16 >> 1 + $blah & 8 << 1 + $blah & 4 << 3 + $blah & 2 << 5 + $blah & 1 << 7;

Bit Twiddling Hacks bit dizileri tersine üzerinde bölümünü kontrol edin. PHP içine tekniklerden birini uyarlamak kolay olmalıdır.

Muhtemelen PHP, 3 64bit işlemlerini kullanarak özellikle büyüleyici bir uygulama var olmasa da:

unsigned char b; // reverse this (8-bit) byte
b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;

Eğer bir dize şeklinde zaten bit kullanmak varsa, strrev.

Değilse, o zaman bindec kullanarak (gerekirse) geri byte gitmek, strrev kullanarak ters ardından, decbin kullanarak kendi ikili gösterimi için ilk bayt dönüştürmek.

Hızlı yolu değil, aynı zamanda daha fazla alan gerektiren bir byte (256 siz dizi için giderseniz) her olası değeri, eşdeğer "ters" ile ilişkili sayede bir arama olduğunu.

Eğer sadece işlemek için birkaç tür byte varsa, bit-bilge operatörleri yapacak ama belki gibi bir şey, yavaş olacaktır:

function reverseBits($in)
{
  $out = 0
  if ($in & 0x01) { $out |= 0x80;}
  if ($in & 0x02) { $out |= 0x40;}
  if ($in & 0x04) { $out |= 0x20;}
  if ($in & 0x08) { $out |= 0x10;}
  if ($in & 0x10) { $out |= 0x08;}
  if ($in & 0x20) { $out |= 0x04;}
  if ($in & 0x40) { $out |= 0x02;}
  if ($in & 0x80) { $out |= 0x01;}
  return $out;
}

Bu, bit uzunluğu ile O (n) 'dir. Sadece bir yığın olarak girdi düşünmek ve çıkış yığını yazmak.

PHP, bu yazı benim girişimi.

function bitrev ($inBits, $bitlen){
   $cloneBits=$inBits;
   $inBits=0;
   $count=0;

   while ($count < $bitlen){
      $count=$count+1;
      $inBits=$inBits<<1;
      $inBits=$inBits|($cloneBits & 0x1);
      $cloneBits=$cloneBits>>1;
   }
}

Ben işleme performansını koz belleğe yüklemek için (büyük tamsayılar için) gerekli süreyi bir tabloyu kullanarak katılmıyorum.

Ben de şöyle bir O (logn) çözümü için bir bit maskeleme yaklaşım kullanın:

MASK = onescompliment of 0    
while SIZE is greater than 0
  SIZE = SIZE shiftRight 1
  MASK = MASK xor (MASK shiftLeft SIZE)
  output = ((output shiftRight  SIZE) bitwiseAnd MASK) bitwiseOR ((onescompliment of MASK) bitwiseAnd (output shfitLeft SIZE))

Bu yaklaşımın avantajı, bir argüman olarak tamsayı boyutunu ele almaktadır

php bu gibi görünebilir:

function bitrev($bitstring, $size){

  $mask = ~0;
  while ($size > 0){

    $size = $size >> 1;
    $mask = $mask ^ ($mask << $size);
    $bitstring = (($bitstring >> $size) & $mask) | ((~$mask) & ($bitstring << $size));
  }
}

Ben bir yerde benim php mahvettim sürece: (