2

このコード行が次のコードとどのように等しいか説明してください:

<?php
$string = chr( ( $number >> 6 ) + 192 ).chr( ( $number & 63 ) + 128 );
?>

と同等:

if ( $number >=128 && $number <=2047 ){

   $byte1 = 192 + (int)($number / 64); //= 192 + ( $number >> 6 )
   $byte2 = 128 + ($number % 64);      //= 128 + ( $number & 63 )
   $utf = chr($byte1).chr($byte2);
 }

たとえば、番号 1989 を入力すると、両方とも生成されます߅

これらのコードは、UNICODE エンティティを元の UTF-8 文字に変換するために使用されます。

4

3 に答える 3

2

$number >> 6バイナリ右シフト操作です。つまり、別名11000000 >> 6 == 00000011と同等です$number / pow(2,6)$number / 64

$number & 63ANDはバイナリです00111111

どちらも累乗または 2 を扱うため、2 項演算として実行する方がはるかに高速です。

于 2013-02-07T22:39:02.227 に答える
2

上のコードは二項演算子を使用しています。 >>は右シフト演算子です。数値のビットを右に (より重要なビットに向かって) シフ​​トします。

そう11110000 >> 2 = 00111100

2 のべき乗による除算 $number >> $nは と同じ$number / pow(2,$n)です。

&「ビットごとの and」演算子です。両方の数値のそれぞれのビットを比較し、両方の数値にあるものを結果に設定し1ます。

11110000 & 01010101 = 01010000

$number63 ( ) で論理積すると、64001111111で割った余り$number(モジュラスとも呼ばれます) が得られます$number % 64

于 2013-02-07T22:40:01.090 に答える