- ベストアンサー
String型の変数に代入されている2つの文字列を論理演算したいです。
String型の変数に代入されている2つの文字列を論理演算したいです。 上記の通りなんですけど 例えば String a = "あいうえお"; String b = "aiueo"; このような二つの文字列を論理演算したあと 16進数の文字列としてあらたな変数(String型)に代入したいのですが どのように記述すればよろしいでしょうか? 初心者なものでわかりやすく説明していただけるとありがたいです。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
ANo.4の者です。 > 初期段階でString型の配列に入ってるものが16進数を文字列表記したものなので 「16進数を文字列表記したもの」というと、普通は数字の0~9、アルファベットのA~F、a~fの文字で構成されたものを指します (マイナス記号や小数点を含む場合もあります)。つまり、"9F8D864E"みたいな文字列です。しかし、元の質問文だと"あいうえお"や"aiueo"という例が挙がっていて「16進数を文字列表記したもの」には見えません。 さらに言えば、「String型の配列」と書かれていますが質問文にもこれまでの補足にも配列でないStringしか現れていません。Stringの配列だったら、 String s[] = { "123", "ABC", "あいうえお" }; のように初期化して、s[2]のようにして要素を参照します。 初心者だということですが、いろいろな用語を間違って使っているのではないかと思います。 > 演算後の結果が > 元の文字数より大きくなるのですが > これは当たり前のことなのでしょうか? 結果を「16進数の文字列としてあらたなString型の変数」として欲しいと言うことだったので、1文字ずつの文字コードを論理演算した結果 (c) の値を16進数の文字列に変換 (Integer.toHexString(c)) してつないでみました。元の文字列での1文字を最大で4桁の16進数表記(+ 改行文字)に対応させているので、元の文字列より長くなったのは当然です。 質問者さんの期待していたものとは違ったようですが、では何が違いますか? 未だに質問者さんが何をやりたいのかがさっぱり分からないので、攻め方を変えます。次の各質問に答えてください。 (質問A) 「論理演算」の対象になる文字列は? (A-1) "あいうえお" "aiueo"など任意の文字列 (A-2) 数字の0~9、アルファベットのA~F、a~fの文字だけを含む、16進数の文字列表記 (A-3) どちらでもない (質問B) 「論理演算」の対象になる2つの文字列の長さは? (B-1) 必ず同じ長さ (B-2) 違っていてもいい (質問C) 「論理演算」の対象になる文字列に "C" という文字が含まれていたとき、論理演算に使用する値は何? (C-1) "C"の文字コードである67 (C-2) "C"を1桁の16進数文字列と見なして12 (C-3) どちらでもない (質問D) 「論理演算」の対象になる文字列に "あ" という文字が含まれていたとき、論理演算に使用する値は何? (D-1) "あ"は文字列には含まれない (D-2) "あ"のUnicodeでの文字コードである12354 (D-3) "あ"の文字コードだが、Unicode以外のもの (D-4) どれでもない (質問E) 元の質問文にある"あいうえお"と"aiueo"だったら、結果として期待している文字列は何? これでも確認したいことの一部でしかありませんが、これら全てに質問者さんが答えられないようだと、何をすればいいのかここの回答者の誰にも分かりません。
その他の回答 (7)
- public_sa
- ベストアンサー率52% (13/25)
NO4です byteにキャストしているのは int以下同士の演算結果は必ず intになるからです。 論理演算も然り。 それをbyte配列に格納するため byteにキャストしているだけです。 別のところからとってきてるとか、 例えば地球の真裏からとってきてても String型である以上、関係ないと思いますが。
- salsberry
- ベストアンサー率69% (495/711)
補足を読んでもどういう結果が欲しいのかがさっぱり分かりません。 a.length()とb.length()が必ず等しいものと決め打ちして、試しに想像でこんなものを書いてみました。質問者さんが期待したものとどう違っているでしょうか。 String result=""; for (int i=0; i<a.length(); i++) { char c=(char)(a.charAt(i) 論理演算 b.charAt(i)); result=result+Integer.toHexString(c)+"\n"; }
補足
わかりづらくてすいません。 端的に言うとString型に入っている文字列同士を 論理演算した後に新しいString型に文字列として入れたいって感じです。 初期段階でString型の配列に入ってるものが16進数を文字列表記したものなので それを普通の16進数にもどして論理演算したかったんです。 salsberryさんが書いてくれたコードをためしたのですが 通ったのは通ったんですが演算後の結果が 元の文字数より大きくなるのですが これは当たり前のことなのでしょうか?
- public_sa
- ベストアンサー率52% (13/25)
No4補足です >>2バイト文字と1バイト文字をどういった風に扱うか >>って問題は別問題なのでここでは省略(結構面倒だし) って書いたけどこの場合そんなに面倒でなさそう charAtだけでいけそうですね。
- public_sa
- ベストアンサー率52% (13/25)
Tacosanの回答をコード化しただけですけど。。。 2バイト文字と1バイト文字をどういった風に扱うか って問題は別問題なのでここでは省略(結構面倒だし) 1バイト文字での実装 ※日本語で[論理演算子]って書かれたところは 好きな論理演算子を入れてください final byte [] bytes1 = "abcde".getBytes(); final byte [] bytes2 = "auieo".getBytes(); final int loopCount = Math.max(bytes1.length, bytes2.length); final byte [] original = new byte [loopCount]; for (int i = 0; i < loopCount; original[i] = (byte)(bytes1[i] 論理演算子 byte2[i]), i++); System.out.println(new String(original));
補足
別のところから取得してきた文字列なので String型になってしまってるんですよね・・・ byte型にキャストしたほうがよろしいのでしょうか?
- anicicle
- ベストアンサー率36% (129/356)
No.1です >両方共をビット列にして論理積や論理和をしたかったんですが・・・ >無理なのでしょうか? 論理演算自体はできます。 しかし、文字同士を論理演算した場合、同じ文字でも「文字コード」によって内容が変わってくる場合や、そもそもの一文字に対して必要なバイト数が違うということを把握しているかの確認です。 理屈的には一文字ずつ取り出して行えばいいのです。
補足
ビット列に変換してから論理演算したかったのです。 文字同士というよりはString型の配列に入った ビット列同士っていう感じでお願いしたいのですが・・・
- Tacosan
- ベストアンサー率23% (3656/15482)
理屈の上では 1文字づつ論理演算すればいい. だから, 例えば「文字列の 3文字目」などが分かれば何とかなる.
補足
1文字づつですか・・・ 結構大変そうですね! サンプルでは5文字で書いたのですが 実際はもっと長いので・・・
- anicicle
- ベストアンサー率36% (129/356)
「論理演算」の理解は大丈夫ですか? また、「論理演算」を行った際に求める結果はどのようなものですか? >String a = "あいうえお"; >String b = "aiueo"; で説明できなければ、別の例でもいいです。 何か「論理演算」について誤解があるような……
補足
両方共をビット列にして論理積や論理和をしたかったんですが・・・ 無理なのでしょうか? そのあとそのビット列を16進数に戻したかったんです。
補足
実行結果がなにかよくわからない 配水管みたな形になってしまうのですが こちら側になにかたりないものでもあるのでしょうか? 最終的にString型の文字列として結果を保持したいのですが・・・