No.5ベストアンサー
- 回答日時:
いやいや。
基本の考えは一緒でも、記述方法が違うこともあるし
同じ記述に見えて、実際の動作が違うこともあります。
今回の場合も
C/C++
→ | 演算では、実数型(double,float)は使えない。
Javascript
→ | 演算では、整数に変換されて、計算される
という違いがあります。
そのサンプルコードでは、この「整数に変換」という効果だけを使おうとしています。そのための、0でのor演算です。
ご回答ありがとうございます。
どっちの言語の説明を見てもビット演算だったので、
大丈夫かなと思ってましたが、浅はかでした。
同じと考えたらなら、C/C++カテゴリのほうが回答ユーザ数が多い、
というイメージがあったので、回答も得られやすいかと思いまして・・・
実質は整数にキャストする方法として
ビットのor演算を使用しているという認識でいいんですね?
(早まって、回答閉めきってしまったので、お返事は出来ないと思われますが)
No.4
- 回答日時:
>ここではJavaScript記述となっていますが、
基本的な考え方は変わらないと考えているため、
C、C++カテゴリで質問しています
これは間違いです。
こういったところは言語に非常に左右されます。
javascriptであれば必要な処理になります。
基本的な考え方、と言うのはアルゴリズムについては変わりませんが、
データ構造という点では当てはまらない場合が多いです。
ご回答ありがとうございます。
どっちの言語の説明を見てもビット演算だったので、
大丈夫かなと思ってましたが、浅はかでした。
次回以降は、的確なカテゴリに質問するように心がけます。
No.3
- 回答日時:
ビット演算は規格上オペランドとして汎整数型を要求しますから, ccc が float や double (や long double) などの型であるときには下の式はコンパイルエラーになるのが正しい動作です>#2. そして整数拡張により ccc の型がどうであろうと ccc*1000 の型は少なくとも int になるので, こっちの「0 とのビット和」は完全に無意味です.
上の方も無意味だと思うけど.... 少なくとも代入演算子のオペランドとして bbb を評価しないといけないし,
・その結果として整数拡張されて int (以上) になる
・どうせ左辺の aaa にあわせて型変換される
のどちらかの理由でやっぱり「0 とのビット和」は意味がないような気がする.
#2 の最後で触れられている, 「組み込み系だったら~」の部分も含めて完全に #2 に同意.
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が整数型なら、そもそも小数点以下が無いので、この計算をしても値は変化しません
(おそらく。もしかしたら、浮動小数点演算時の誤差が出る場合も)
何のサンプルコードか、情報を公開してはどうでしょうか。もちろん、支障の無い範囲で。
もしかしたら、これが重要な意味を持つ処理系があるかもしれませんが、私は知りません。
(組込みマイコン用とかで、何か意味がある、とかの可能性はありそうです)
この回答への補足
ご回答ありがとうございます
サンプルコードの詳細は
http://jsdo.it/calmbooks/controllerStick
少々わかりづらいですが、
↑のサイト(IE7等のブラウザでは見れないかもしません)の
中央付近のタブ「JavaScript 226 lines」をクリックし、
表示されたソースの 155行目、168行目となります。
ここではJavaScript記述となっていますが、
基本的な考え方は変わらないと考えているため、
C、C++カテゴリで質問しています
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
文字参照は10進数と16進数では...
-
情報源符号化について
-
CASLのビットマップについて
-
2の補数
-
シーケンス制御について質問で...
-
1の補数
-
C言語で行列の演算するには?
-
数値計算における誤差について
-
PIC16F88で500という数字を8ビ...
-
いまいちビット演算の目的が分...
-
三菱シーケンサーの命令でFROM ...
-
エクセルVBAのIf,Then 構...
-
PS3に搭載されている"Cell"は、...
-
二元対称無記憶通信路を実現す...
-
シーケンサのデータレジスタD...
-
アセンブラからC言語に変換する...
-
レジストってなんですか?
-
アセンブラ言語で質問です。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
エクセルVBAのIf,Then 構...
-
A4 持ち込み
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
文字参照は10進数と16進数では...
-
符号無し整数xを右にnビット回転
-
C言語で128bitの2進数のビット...
-
シーケンス制御についての質問...
-
PLC 命令について
-
命令について
-
Python: 数値を反転させたい
-
情報科学の飽和演算、ラップア...
-
1の補数
-
03分22秒36のような時間の単位...
-
ビット立つの意味
-
verilog 符号付加減算(最上位...
-
上位ビットと下位ビットの入れかえ
-
シーケンス制御について質問で...
おすすめ情報