文字を 7 ビットの偶数パリティに変換したいと考えています。これを実装する方法を教えてください。
2121 次
3 に答える
3
x86 JPO 命令 (Parity Odd の場合はジャンプ) を使用できないのは残念です;-)
処理するデータの量によっては、文字ごとにチェック/処理するよりも、最初に変換テーブルを設定した方が高速になる場合があります。
$map = array();
for($char=0; $char<128; $char++) {
$parity = 0;
for($bit=0; $bit<8; $bit++) {
if($char & (1<<$bit)) {
$parity ^= 128;
}
}
$map[chr($char)] = chr($char|$parity);
}
(このコードを徹底的にテストする必要があるかもしれませんが、私はまだ行っていません)
次に、strtr()を使用して ascii7 から ascii7-evenbit に変換します。
$input = 'mary had a little lamb'; // all characters must be within the ascii7 range
$evenbit = strtr($input, $map);
// test output
for($i=0; $i<strlen($evenbit); $i++) {
printf("%08s\n", decbin(ord($evenbit[$i])));
}
于 2009-12-10T16:55:08.820 に答える
1
Cバージョンは次のとおりです。
uint8_t even_parity (uint8_t b)
{
return b ^ ((3459840 >> ((b ^ (b >> 4)) & 15)) & 128);
}
PHP への変換は簡単だと思いますが、恥をかかないようにします。
この Bit Twiddling Hackに触発されました。
于 2009-12-11T03:06:08.297 に答える
0
反対票のリスクがある場合:
function to7BitEven($byte) {
if( $byte > 0x7f ) return 0;
$binary = decbin($byte);
$one = 0;
$ret = 0;
for($x=0;$x<strlen($binary);$x++) {
if( $binary[$x] == '1' ) $one++;
}
if( $one % 2 != 0 ) $ret = "1";
else $ret = "0";
for($x=0;$x<(7-strlen($binary));$x++)
$ret .= "0";
$ret .= $binary;
return $ret;
}
echo to7BitEven(0x7f) . "\n";
echo to7BitEven(0x41) . "\n";
echo to7BitEven(0x3a) . "\n";
echo to7BitEven(0x3b) . "\n";
これは 1 をカウントし、余分な 1 (奇数の場合) または 0 (偶数の場合) を最初のビットに追加します。次に、残りの 7 ビットを戻り値にコピーします。これにより、バイトの偶数パリティである 7 ビットの文字列表現が残ります。
私よりも経験豊富な人には、これは正しいように見えますか? 出力例:
11111111
01000001
00111010
10111011
于 2009-12-10T16:28:21.650 に答える