Bruce.です。
davi さんは書きました (2008/12/26 22:29):
>> if (iskanji(c)) {
>> if (iskanji2(c2 = fgetc(fp)))
>> c = ((c << 8) | c2);//←2バイト文字なら上位下位のペアを組み立てる
>
> この8って何じゃ?、と思っていたら、SJISの2バイト文字が8140〜だから、
> 読み込んだ1バイト(8ビット)分の、先頭が8以下なら半角(ASCIIだけでなく
> 半角カナも含む)、という判断にする根拠に使っていたんですね。
先頭が8以下ってはどこから湧いて出たんですか?
81 と 40 から 8140 を組み立てるには、81*16 + 40 を行えばよいわけで、
掛け算の部分は左へ8ビットシフトするのに置き換えることが可能で、
また足し算部分も0のところに加算するので bitwise or に置き換えられる。
ということで
(c << 8) | c2
となっているだけの話ですが。
前回のメールに書いたように、このプログラムではいわゆる半角文字は
上位バイトが 00 になりますから、0xff を越える値かどうかで
判定しています。
>> 004C 0043 0053 02F0 0E67 02A4
>>
>> という16ビットごとの並びにして、処理を進めているわけです。
>
> ある意味、独自に内部コード化してる、ということですか?
そうです。
> すると、拭(SJISで9040)、漾(SJISでE040)なんかは、
> それぞれ1040、7040となるわけですか?
90 → 1001_0000
E0 → 1110_0000
ですので、そこから最上位ビットを落とすと 10 と 60ですね。
--
木村浩一
I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?
mail kbk [at] kt.rim.or.jp
web www.kt.rim.or.jp/~kbk/zakkicho/
homepage3.nifty.com/farstar/