PHP で文字列のビット演算

ビット演算をする場合、通常は整数値を使うのだが、基本的には 32ビットしか使えない。(未確認だが、64ビットOSなら64ビット整数が使える?)
PHP では、文字列でもビット演算に対応しているらしいので使ってみることにする。ということで、文字の "0" と "1" を使ってビット演算したい。

http://php.net/manual/ja/language.operators.bitwise.php

ただし、

もし左辺値と右辺値共に文字列であった場合にはビット演算子は 文字の ASCII 値に対して作用します。

ということなので、AND と OR は何とか動くが、それ以外は期待した値にはならなかった。

対策には以下の2通りが考えられる(考えただけで未確認)。

  • ASCII値の 0 と 1 を使う(文字 "0" と "1" を置換)
  • 演算子を使わず独自に文字列処理する

どちらも一長一短。

追記

だめだった。

  • ASCII値の 0 と 1 を使う(文字 "0" と "1" を置換)

では、XOR はできたけど、シフト演算がうまくいかない・・・。

ちなみに置換のロジックは、以下のとおり。

<?php
define('CHR_0', chr(0));
define('CHR_1', chr(1));

function swap($s) {
  $len = strlen($s);
  $tmp = str_pad('0', $len);
  for ($i = 0; $i < $len; $i++) {
      switch ($s[$i]) {
        case CHR_0: $tmp[$i] = '0'; break;
        case CHR_1: $tmp[$i] = '1'; break;
        case '0': $tmp[$i] = CHR_0; break;
        case '1': $tmp[$i] = CHR_1; break;
      }
  }
  return $tmp;
}

$a = '1100';
$b = '1010';

# XOR (成功)
echo swap(swap($a) ^ swap($a)) . "\n";
# シフト (失敗)
echo swap(swap($a) << 2) . "\n";

う〜む。ただ演算子を使いたいだけなのだが、無駄なループ処理してるなぁ(w