質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.60%

C++ bool値の演算は論理演算を使わずにビット演算でも大丈夫でしょうか?

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 13K+
退会済みユーザー

退会済みユーザー

コードとしては下記の様な感じです。

bool result = true;

// bool値を論理演算で比較して結果を代入
result = result && true;

// 上記だと result 2回出てきてなんかスッキリしないので、ビット演算でも結果が同じなら使いたい
result &= true;

C++ の bool型は、内部的に 0/1 のint値管理のイメージがあるので、
ビット演算でも論理演算と同じ結果が得られそうなのですが、
実際のところ全てのコンパイラで問題無いのでしょうか?

一応下記で確認した限りでは、論理演算でもビット演算でも同じ結果が得られました。
http://ideone.com/e.js/zVWZKA

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    bool is_true = true;
    bool is_false = false;
    cout << "is_true : " << is_true << endl;
    cout << "is_false : " << is_false << endl;
    cout << endl;

    // bool値の演算は、論理演算ではなくbit演算子でも良いのだろうか?
    // C++的に boot値は 0/1 で内部的には持ってそうなので行けそう?
    // ビット演算子だと代入が簡単なので使いたいなーというお話

    // is_true   true
    cout << "is_true && true : " << (is_true && true) << endl;
    cout << "is_true & true : " << (is_true & true) << endl;    // これが使える is_true &= true
    cout << "is_true || true : " << (is_true || true) << endl;
    cout << "is_true | true : " << (is_true | true) << endl;    // これが使える is_true |= true
    cout << endl;

    // is_false   true
    cout << "is_false && true : " << (is_false && true) << endl;
    cout << "is_false & true : " << (is_false & true) << endl;    // これが使える is_false &= true
    cout << "is_false || true : " << (is_false || true) << endl;
    cout << "is_false | true : " << (is_false | true) << endl;    // これが使える is_false |= true
    cout << endl;

    // is_true   false
    cout << "is_true && false : " << (is_true && false) << endl;
    cout << "is_true & false : " << (is_true & false) << endl;    // これが使える is_true &= false
    cout << "is_true || false : " << (is_true || false) << endl;
    cout << "is_true | false : " << (is_true | false) << endl;    // これが使える is_true |= false
    cout << endl;

    // is_false   false
    cout << "is_false && false : " << (is_false && false) << endl;
    cout << "is_false & false : " << (is_false & false) << endl;    // これが使える is_false &= false
    cout << "is_false || false : " << (is_false || false) << endl;
    cout << "is_false | false : " << (is_false | false) << endl;    // これが使える is_false |= false

    return 0;
}
is_true : 1
is_false : 0

is_true && true : 1
is_true & true : 1
is_true || true : 1
is_true | true : 1

is_false && true : 0
is_false & true : 0
is_false || true : 1
is_false | true : 1

is_true && false : 0
is_true & false : 0
is_true || false : 1
is_true | false : 1

is_false && false : 0
is_false & false : 0
is_false || false : 0
is_false | false : 0
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

実際のところ全てのコンパイラで問題無いのでしょうか? 

質問にあるコード例であれば、全てのC++コンパイラで期待通り動作します。

少し気になるのは、本当にそのようなことをしたいのでしょうか?例えばbool型の変数resultがあったとき、result &= true;は「何もしないこと」と同義です。他パターンも同様に:

result &= true;   // 何もしない
result &= false;  // result = false;と同義
result |= true;   // result = true;と同義
result |= false;  // 何もしない

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/30 15:38

    ご回答ありがとうございます。

    >少し気になるのは、本当にそのようなことをしたいのでしょうか?
    具体的には、JSONをパースする処理内で利用する想定です。

    JSONデータの仕様的に状況によって型が変わる箇所があるので、
    その箇所で型チェックをして想定外なら全パース失敗とする処理を行う想定です。

    そもそも、JSONデータの仕様的に型が変わって変える場合があること自体、
    違和感ありありなのですが、そのように返ってきてしまうので・・・

    ```C++
    bool result = true;

    result &= [JSONの項目1].isDouble(); // double型想定。
    result &= [JSONの項目2].isString(); // string型想定。

    // 上記で [JSONの項目1] が stringとかが来ていたらfalse にしてしまう

    ...
    ...
    ...
    ```

    キャンセル

  • 2016/08/30 15:42

    質問中にあるtrue/falseリテラル部分は、実際にはプログラム実行時に決まる値なんですね。それなら意味はあると思います。

    キャンセル

0

x、y がbool型の変数とします。もし、これらが局所変数でうっかり初期化を忘れてしまった場合などでは、値がtrueでもfalseでもないゴミである可能性があります。その場合、x && y と x & y は同じとは限りません。
もうひとつ、f(z)がbool型の副作用のある式だとします。この場合、

x = x && f(z);

はxがfalseの場合、f(z)は評価されませんので副作用はありません。しかし、

x &= f(z); の場合は、xの値が何であってもf(z)は評価されますので必ず副作用があることになります。

そのため、論理演算子をビット演算子に置き換えた場合に挙動が異なる可能性があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る