人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

「enchant.jsスマートフォンゲーム開発講座」とういう本を読んでいるのですが、ソースコードで以下のようなものがります。

var x = randfloat(0,300)|0;


この「|」ってどういう意味かわかりません。
「||」は論理 ORなのはわかるのですが。。
教えていただけないでしょうか?
よろしくお願いします。

●質問者: 匿名質問者
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● 匿名回答1号

ビット演算のOR。

var a = randfloat(0,300);
// var x = Math.floor(a) == 0 ? 0 : a; ※間違ってます!
var x = Math.floor(a) == 0 ? 0 : Math.floor(a);

もしくは、

var a = randfloat(0,300);
var x;
if (Math.floor(a) == 0) {
 x = 0;
} else {
// x = a; ※間違ってます!
 x = Math.floor(a);
}

と、同値。

ビット演算が極めて速いのは、アセンブラか C の類なので、無意味に分かりにくい。
たいした本じゃないと思います。


追記。
3号さんのコメントで、ようやく気が付きました。
たいした本じゃないとケチをつけたやつが、たいしたやつではないという...


また追記。
ゼロの場合を分ける意味がないんじゃないかと言われました orz

var x = Math.floor( randfloat(0,300) );

匿名回答3号さんのコメント
このコードはほとんど何もしていないですね。バグってます。 「たいした本じゃない」というのは多分そうなんでしょうがww Math.floor()と「|0」の動作が異なるのは、対象が負の場合です。 なので正の場合は Math.floor()をそのまま使い、負の場合は +1 してから Math.floor() に渡すなどといった処理が必要かと思います。

匿名回答1号さんのコメント
「たいした本じゃない」と書いたのは、呪文のような(つまり、分かりにくい)コードを、たいしたメリットもないのに書いていること。 しかも、開発講座という、教える目的の本で。 randfloat は、関数名と引数から、0?300の乱数(浮動小数点)を返すものだと思ったので、Math.floor を使ってみただけ。 x|0 と挙動を合わせたいなら、以下の方がまだマシ。 >|| var x = parseInt( randfloat(0,300) ); ||< 挙動としては x|0 同様にマジックだけど、整数化している、というのはたいていの人が分かるから。 正と負の場合を分けて書いて良いなら、Math.ceil と組み合わせる。 >|| if (a >= 0) { x = Math.floor(a); } else { x = Math.ceil(a); } ||< ここで、x|0 派は、「だから、こんな冗長なコードを書かなくても...」みたいな話をしだす。 場所を変え、言語を変え、昔から煮たようなことが繰り返されてきました。 質問のコードが、高速化とか、パフォーマンスチューニングみたいな章に書かれていて、何万回も呼ばれるところだから、何% 稼げるみたいなことが書いてあるのだったら、まだマシ。 でも、javascript では、さして効果がないはず。 ゲームの開発ということは、種類によるけど乱数の精度はたいして求められないはずなので、乱数表を起こしておいて表引きで使う方が、性能にはずっと寄与が大きい(はず)。

匿名回答1号さんのコメント
# 3号さんのコメントに同意を示して、補足したつもりです

匿名回答3号さんのコメント
本に対する批判にはまったく同意いたします。 ただ匿名回答1号さんの最初のコードの意図が分からないです。 負の場合でなくても「|0」と 同値にはなりません。 バグだと思ったのですが、ちがうのでしょうか。 (しつこくてすいません。初心者の質問者さんは悩んでしまうと思ったので)

匿名回答1号さんのコメント
>> ただ匿名回答1号さんの最初のコードの意図が分からないです。 << あ゙

匿名回答1号さんのコメント
ようやく気が付きました orz

匿名回答3号さんのコメント
先生、0 の場合を分ける意図が分かりません! (さらに、しつこくて本当にすいませんww)

匿名回答1号さんのコメント
ゔ

匿名質問者さんのコメント
ご回答ありがとうございます。 もやもやしてたのがすっきりしました。 すぐに答えいただき感謝です!

2 ● 匿名回答2号
ベストアンサー

http://okwave.jp/qa/q8449636.html
http://memocarilog.info/jquery/6480

小数点以下を切り捨てるための定型文だそうで


匿名質問者さんのコメント
なるほど、知らなかったです。 ありがとうございます。

3 ● 匿名回答3号

小数点以下を切り捨てて、整数に変換する為のものです。

JavaScript は「弱い型付け」の言語です。
演算時に渡された値が、期待される型でなかった場合、自動で変換します。(出来るなら)

たとえば「文字列でない値」と「文字列」の + 演算の場合「文字列でない値」を文字列に変換した上で結合するというルールになっています。

a = 1 + '1';
// => '11'

この性質を利用して、値を目的の型に変換するという手法が一部で使われています。

文字列に変換 a = x + "" "" (空文字列)を +
数値に変換 a = x - 0 0 を -
切り捨てで整数に変換 a = ~~x ~ 演算子に2回かける
真偽値に変換 a = !!x ! 演算子に2回かける

「|0」は上記の「~~」と同じですね。ビット演算子が整数を要求していることを利用して、整数にしています。Math.floor(x) と似ていますが x が負の場合、切り捨てかたが違います。


匿名質問者さんのコメント
ご丁寧かう、的確なご回答ありがとうございます。 すっきりしました。勉強になりました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ