96557


下のような式があり、結果としてはヨコ w 列のマスの特定の場所（pos：0
から始まるマスの番号）が上から何行目かが分かるのですが、この式の具体的な意味が分からなくて質問しました。

[code]

    const w = 8;
    const pos = 15;
    const result = pos / w | 0;
    
[/code]

小数点を切り捨てるだけなら、下のようにすればいいと思うのですが、なぜ`n | 0`を行う必要があるのでしょうか？

[code]

    const n = pos / w;
    const result = Math.floor(n);
    
[/code]

調べるとこれはビット論理和というらしく、2進数に変換した値の一方のオペランドのビットが 1 であれば 1
になるとのことでした。これの使いどころがいまいちよく分かっておりず、もし詳しい方がいらっしゃいましたらご教示いただけると助かります。  
よろしくお願いいたします。


CC BY-SA 4.0
2023-10-23T12:32:08.067
96556
2023-10-24T23:30:47.043
44487
question
javascript
ビット論理和が使われている式の意味が知りたい


元々はJavaScriptソースコードを短縮するためのハックです。`Math.floor(pos/w)`よりも`pos/w|0`の方が短いわけです。Webは表示毎にWebサーバーからブラウザーへHTML
/ JS / CSSを送信する必要があるため、ソースコードを短くすることで読み込み速度を改善する意義がありました。

その後、JavaScriptの高速化という別の意味を持ちました。JavaScriptの数値型は`Number`；浮動小数点数と定められていますが、配列インデックスなど整数としての利用側面もあります。そこでJavaScriptエンジン内部では`Number`の中でも整数として扱えるのであれば整数として処理してしまうことで高速化するものも登場しました。例えばGoogle
v8であれば[smi](https://github.com/v8/v8/blob/main/src/objects/smi.h#L17C1-L22C33)という特殊なオブジェクトが存在します。

[code]

    // Smi represents integer Numbers that can be stored in 31 bits.
    // Smis are immediate which means they are NOT allocated in the heap.
    // The ptr_ value has the following format: [31 bit signed int] 0
    // For long smis it has the following format:
    //     [32 bit signed int] [31 bits zero padding] 0
    // Smi stands for small integer.
    
[/code]

これを受けて[asm.js](http://asmjs.org/spec/latest/)では`|0`は整数を表すアノテーションと定められています。

* * *

ちなみに`|0`以外にも`>>0`や`~~`など手段は他にもあります。その上でなぜ`|0`なのかというと、[JavaScript演算子の優先順位の一覧表](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Operator_precedence#%E4%B8%80%E8%A6%A7%E8%A1%A8)を見るとわかりますが、`|`は優先順位がそこそこ低いため左側に来る式を
`()` で括る状況が減らせるからです。


CC BY-SA 4.0
2023-10-23T14:14:59.963
96557
2023-10-24T23:30:47.043
2023-10-24T23:30:47.043
4236
4236
96556
answer