perlで文字列のビット演算をする際、

どういった変換がなされているのか教えてください。

例 : "50" & "4" = 4

ここでは"50"と"4"は何に変換され、
最終的に4という答えにいたるのでしょうか。

初歩的なことで申し訳ないですが、
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/01/25 18:50:13
  • 終了:2008/01/26 08:47:36

回答(3件)

id:dungeon-master No.1

dungeon-master回答回数571ベストアンサー獲得回数402008/01/25 19:59:20

ポイント45pt

http://www.rfs.jp/sb/perl/02/bit.html

それぞれの文字をAsciiコードに直して、対応する位置の値どうしで演算します。


ご質問のケースでは、

"50"→Asciiの 0x35,0x30の並び。

"4"→Asciiの 0x34,0x00の並び(0x00は演算時の長さをそろえるために付与)

それぞれの値をビットAND演算すると

0x35 & 0x34 → 0x34

0x30 & 0x00 → 0x00


0x34,0x00の並びは、"4"の文字とNull文字。

ということで、見た目は「4」になった考えられます。

id:the_yakisoba

お早い回答大変助かります。

>"4"→Asciiの 0x34,0x00の並び(0x00は演算時の長さをそろえるために付与)

この部分で0x00をつけるとのことですが、

なぜ

0x00,0x34の順でなく0x34,0x00の順なのでしょう

2008/01/25 20:12:13
id:uehaj No.2

uehaj回答回数158ベストアンサー獲得回数152008/01/26 00:58:13

ポイント27pt

最後に0x00をつける話ですが、これは長さをそろえるため、というより文字列の末尾を表すターミネーター文字(ナル)文字ではないかと思います。

短いほうの文字の最後のターミネーター文字(0x00)がANDで作用されることにより、長いほうの文字の同じ位置に0x00が入ることで、文字列の長さが短いほうと同じ長さに切りそろえられているように見える、ということだと思います。

id:uehaj No.3

uehaj回答回数158ベストアンサー獲得回数152008/01/26 08:16:40

ポイント8pt

最後に0x00をつける話ですが、これは長さをそろえるため、というより文字列の末尾を表すターミネーター文字(ナル)文字ではないかと思います。

短いほうの文字の最後のターミネーター文字(0x00)がANDで作用されることにより、長いほうの文字の同じ位置に0x00が入ることで、文字列の長さが短いほうと同じ長さに切りそろえられているように見える、ということだと思います。

  • id:dungeon-master
    あらためて解答つけるほどでもないのでコメントで。

    >0x00,0x34の順でなく0x34,0x00の順なのでしょう

    "50"も"4"も数字ではありますが、ここで扱うデータとしてはあくまでも文字列。
    先頭の文字から順に対応させて演算させるため、前には付けないのでしょう。
    文字列どうしの比較とかでも、それぞれの先頭の文字から順に対応して比較されます。
    比較もANDやORも「文字列どうしの演算」ですから、同じルールが適用されていると
    考えればよいと思います。
  • id:dungeon-master
    >文字列の末尾を表すターミネーター文字(ナル)文字ではないかと思います。
    PerlはCとは違います。これは間違いですので気をつけてください。

    http://www.geocities.jp/ky_webid/perl5/006.html に
    「C言語の文字列と違い、Perl の文字列の末尾には '\0' のようなヌル文字はありません。」
    とあります。
    Perlでは文字列の途中に0x00の文字を含めることもできます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません