• ベストアンサー

サンプルプログラムにあったビット和の意図

あるサンプルプログラムで出てきた記述なのですが aaa =bbb | 0; ccc = ((ccc * 1000) | 0) * 0.001; ここで使用されている「|」の意図がわかりません。 「|」自体がビット和の演算子であることは理解しています。 ですが「| 0」とした場合、値は何も変わらないのではないでしょうか? 何か特別な意図があるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

いやいや。 基本の考えは一緒でも、記述方法が違うこともあるし 同じ記述に見えて、実際の動作が違うこともあります。 今回の場合も C/C++ → | 演算では、実数型(double,float)は使えない。 Javascript → | 演算では、整数に変換されて、計算される という違いがあります。 そのサンプルコードでは、この「整数に変換」という効果だけを使おうとしています。そのための、0でのor演算です。

nemu19
質問者

お礼

ご回答ありがとうございます。 どっちの言語の説明を見てもビット演算だったので、 大丈夫かなと思ってましたが、浅はかでした。 同じと考えたらなら、C/C++カテゴリのほうが回答ユーザ数が多い、 というイメージがあったので、回答も得られやすいかと思いまして・・・ 実質は整数にキャストする方法として ビットのor演算を使用しているという認識でいいんですね? (早まって、回答閉めきってしまったので、お返事は出来ないと思われますが)

その他の回答 (4)

  • k_kota
  • ベストアンサー率19% (434/2186)
回答No.4

>ここではJavaScript記述となっていますが、 基本的な考え方は変わらないと考えているため、 C、C++カテゴリで質問しています これは間違いです。 こういったところは言語に非常に左右されます。 javascriptであれば必要な処理になります。 基本的な考え方、と言うのはアルゴリズムについては変わりませんが、 データ構造という点では当てはまらない場合が多いです。

nemu19
質問者

お礼

ご回答ありがとうございます。 どっちの言語の説明を見てもビット演算だったので、 大丈夫かなと思ってましたが、浅はかでした。 次回以降は、的確なカテゴリに質問するように心がけます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

ビット演算は規格上オペランドとして汎整数型を要求しますから, ccc が float や double (や long double) などの型であるときには下の式はコンパイルエラーになるのが正しい動作です>#2. そして整数拡張により ccc の型がどうであろうと ccc*1000 の型は少なくとも int になるので, こっちの「0 とのビット和」は完全に無意味です. 上の方も無意味だと思うけど.... 少なくとも代入演算子のオペランドとして bbb を評価しないといけないし, ・その結果として整数拡張されて int (以上) になる ・どうせ左辺の aaa にあわせて型変換される のどちらかの理由でやっぱり「0 とのビット和」は意味がないような気がする. #2 の最後で触れられている, 「組み込み系だったら~」の部分も含めて完全に #2 に同意.

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

どちらも意味が無いと思われます。 #1さんのような意図があったとしても、 aaa=bbb|0は、bbb|0でサイズを合せなくても、 aaa=bbbと代入するだけで暗黙のキャストでaaaに合わされます(可能な場合) ccc = ((ccc * 1000) | 0) * 0.001;は式全体が意味不明です。 cccを1000倍して整数化(小数点以下切り捨て)→0.001倍、で、小数点以下3位に揃えているようにも見えます。 ですが、cccが実数型(double,float)だと、ccc*1000は実数となり、|による演算が使えません (少なくとも、手許のgccではエラーになります) cccが整数型なら、そもそも小数点以下が無いので、この計算をしても値は変化しません (おそらく。もしかしたら、浮動小数点演算時の誤差が出る場合も) 何のサンプルコードか、情報を公開してはどうでしょうか。もちろん、支障の無い範囲で。 もしかしたら、これが重要な意味を持つ処理系があるかもしれませんが、私は知りません。 (組込みマイコン用とかで、何か意味がある、とかの可能性はありそうです)

nemu19
質問者

補足

ご回答ありがとうございます サンプルコードの詳細は http://jsdo.it/calmbooks/controllerStick 少々わかりづらいですが、 ↑のサイト(IE7等のブラウザでは見れないかもしません)の 中央付近のタブ「JavaScript 226 lines」をクリックし、 表示されたソースの 155行目、168行目となります。 ここではJavaScript記述となっていますが、 基本的な考え方は変わらないと考えているため、 C、C++カテゴリで質問しています

  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.1

定数の「0」は「int型」なので、演算の結果は「最低でもintサイズになる事」が保証される。 言わば「int型へのキャスト」と近い働きがある。 「int型への型キャスト」と異なるのは「|の左辺がintよりも大きいサイズの時、そのサイズが保持される」と言う点。 例えば aaa =bbb | 0; の構文で「bbbがunsigned charだった」としよう。 「0はintサイズ」なので「bbb | 0」の結果は、大きいほうのサイズである、intサイズが保証される。 同一の構文で「bbbがintよりもサイズが大きいlongだった」としよう。 「0はintサイズ」なので「bbb | 0」の結果は、大きいほうのサイズである、longサイズが保証される。 一方、 aaa =(int)bbb; の構文の場合、話は違う。 「bbbがunsigned charだった」なら、結果はintサイズ。これは上記と一緒。 「bbbがintよりもサイズが大きいlongだった」場合も、結果はintサイズになっちゃう。これは上記とは異なる。 このように「値が変わらないけど、型が変わる。しかも、明示的キャストと違い、式中の最大サイズの型が保証される」と言う作用があるので「型だけ変えたい」と言う意図でやっていると思う。

関連するQ&A

  • vbs csv編集 プログラム

    vbsで以下のように編集したいです。 <編集前>    A     B      C 1 aaa@aaa.jp bbb@bbb.jp ccc@ccc.jp 2       bbb@bbb.jp ccc@ccc.jp 3             ccc@ccc.jp <編集後>    A     B      C      D 1 aaa@aaa.jp aaa@aaa.jp bbb@bbb.jp ccc@ccc.jp 2 bbb@bbb.jp       bbb@bbb.jp ccc@ccc.jp 3 ccc@ccc.jp             ccc@ccc.jp <編集後> (1)A列に値がある場合は、その値をA列にコピーする。 (2)A列に値がなく、B列に値がある場合は、その値をA列にコピーする。 (3)B列に値がなく、C列に値がある場合は、その値をA列のコピーする ※A、B、C列すべてに値がある場合は、A列の値をA列(編集後)にコピーする。 上記可能でしたら、コードのご教示お願いいたします。

  • Perl言語でファイル入出力プログラムについて

    Perlでファイル入出力のプログラムをコーディングしたいのですが、いまいちハッシュが理解しずらく困っています。わかる方よろしくお願いします。 moto.pl の中にあらかじめ AAA aaa AaAa AAaa BBB bbb BbBb BBbb CCC ccc CcCc CCcc AAA aaa AaAa AAaa .... というように一行ずつ文字列があり、この場合では最初の大文字AAAが二つあるので、その結果を例えばsaki.plに AAA 2 ... というように出力するプログラムを教えて頂けませんか?

    • ベストアンサー
    • Perl
  • VB6.0 フォルダ配下(サブフォルダ含む)のファイルを全て読み込む方法

    環境 OS:WINDOWS 2000 PRO ソフト:VisualBasic 6.0 指定したフォルダ配下の全てのhtmlファイルを読み込む機能を作成したいと考えています。 C:\AAA\BBB\CCC\sample1.html C:\AAA\BBB\CCC\sample2.html C:\AAA\BBB\CCC\DDD\sample3.html C:\AAA\BBB\CCC\DDD\EEE\sample4.html C:\AAA\XXX\YYY\ZZZ\sample5.html 以上のような構造になっていた場合に、ルートフォルダとして『C:\AAA』を指定し、その配下全てのhtmlファイルを読み込み、1ファイルずつ加工したいと考えています。 何階層にも渡るファイルを全て読み込む方法がわかりません。 よろしくお願い致します。

  • ビット演算を学びたい

    a &= 2; a |= 2; a ^= 2; a ~= 2; a <<=2; a >>=2; みたいな感じでビット演算が使われているソースを 良く見るのですが、いまいちビット演算で何をしているのかが 分かりません。 参考書などには文字通りビットをいじるような旨のことが書いてあります。 (こちらにも同じようなことが http://www9.plala.or.jp/sgwr-t/c/sec14.html) こういうので何となくは分かるのですが、 実際にこれを何に使えるか、実践ではどのように使うのかが なかなか見えてきません。 このビット演算を私のような者でも実際のプログラムで使いこなせるように なれるようなサイトや書籍の提示、あるいはサンプルのプログラムなどで ご指導いただけたらと思います。

  • 別プログラムの標準入力に引数を渡す方法

    以下の加算プログラムhoge.plがあります $aaa = <STDIN>; $bbb = <STDIN>; print($aaa+$bbb); hoge.plを別プログラムから以下のように実行し open(OUT,"| hoge.pl"); hoge.plの$aaa、$bbbに値を代入したい場合どのように渡したらよいのでしょうか?

  • 正規表現でシングルクォーテーションで囲まれた文字列

    VB.NET で開発を行っています。 シングルクォーテーションで囲まれた文字列の検索を行いたいのですが正規表現の記述が良くわからないので困っています。 たとえば 'AAA' + 'BBB' + 'CCC' 上記のの文字列から「'AAA'」「'BBB'」「'CCC'」も検索したいのですが,パターンとして「'.*'」を用いると「'AAA' + 'BBB' + 'CCC'」が返ってきます。 どなたかご教授ください。よろしくお願いします。

  • ディレクトリ構成とプログラム

    ディレクトリ構成とプログラムについて 各カテゴリ(aaa、bbb、ccc)単位に商品一覧を表示しているサイトで ソースをみると下記のようになっています。 <a href="/cat/aaa/">aaa</a> <a href="/cat/bbb/">bbb</a> <a href="/cat/ccc/">ccc</a> クリックするとルートディレクトリは http://www.xxx.jp/cat/aaa/list/?num=20と表示されます。 ※numは表示商品のmax数。 index.phpがプログラム名なのはわかりますが ディレクトリ構成が / ├index.php(トップページ) ├cat/list/ │ ├aaa │ │ └list │ │ └index.php │ ├ bbb │ としているとは思えません。 どのようなフォルダ構成、実際のプログラムがある場所、どのような制御をしているのでしょうか? また、考え方が記載されているサイトを教えていただけませんか。

    • ベストアンサー
    • PHP
  • php と C# の ビット演算

    PHPでビット演算をしていますが、 PHPでたとえば、 c = a >> b でビット演算した値と、 C#で演算した値と aの値を大きくした場合、 4000000000以上? は結果が違ってきます。 C#とPHPではビット演算のアルゴリズムが違うのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • WORDの置換で単語の後ろに空白文字を入れたい

    ワード2007です。 横書きで、各行に単語が1つか複数並んでいます。 下記のような場合に、単語の最後に空白文字を入れる(置換する)にはどうすればよいですか? 置換で、「単語の最後」「行の最後」を指定する方法がわかりません 1.AAA   AAA□   BBB ⇒BBB□   CCC   CCC□ 2.AAA AAA    AAA AAA□   BBB BBB ⇒ BBB BBB□   CCC CCC    CCC CCC□  よろしくお願いします。

  • 重複レコードの抽出について

    以下のようなテーブルからmailが重複していてnameの値が全て同じ値を持つレコードを取得するためのSQL文を教えてください。 mail | name ----------- aaa | 01 aaa | 01 aaa | 01 bbb | 02 bbb | 02 bbb | 01 ccc | 01 ccc | 01 ccc | 02 select * from test where mail in (select mail from test where mail group by mail having count(mail)>1) 上記のSQL文だと以下のデータが取得されてしまいます。 ↓ mail | name ----------- aaa | 01 ○ aaa | 01 ○ aaa | 01 ○ bbb | 02 × bbb | 02 × ccc | 01 × ccc | 01 × ○印のみ取得したいのですが、 SQL文をどのように修正すればよいのでしょうか。 よろしくお願いいたします。

専門家に質問してみよう