"|" Ne anlama gelir? (tek boru) JavaScript'te mi?


152
console.log(0.5 | 0); // 0
console.log(-1 | 0);  // -1
console.log(1 | 0);   // 1

Neden 0.5 | 0sıfır döndürür, ancak herhangi bir tam sayı (negatif dahil) girdi tamsayısını döndürür? Tek boru ("|") ne yapar?


13
Sözdizimi hatalarının yazdığınız gerçeği konusunda sizi uyarmasını yararlı bir şekilde önler yerine ||
Andrew Myers

Yanıtlar:


161

Bu biraz ya da .
Bitsel işlemler yalnızca tam sayılar üzerinde anlamlı olduğundan 0.5, kesilir.

0 | xxherhangi biri için x.


9
bu, kayan noktalı sayıyı int'e dönüştürmenin veya kullanmanın güzel bir yoludurparseInt()
MaBi

5
@MaBi: Bununla birlikte, değerin 32 bitlik bir tam sayıya dönüştürüldüğünü bilmelisiniz, bu nedenle daha büyük sayılar için düzgün çalışmayacaktır.
Guffa

1
Yani Kat işleviyle aynı kabul edilebilir mi?
May13ank

3
Bunu yalnızca bitsel veya. @ Guffa'nın dediği gibi, büyük sayılar beklendiği gibi davranmayacak. Ör: 248004937500 | 0 = -1103165668
Joseph Connolly

Büyük sayılar, 32-bit int'e dönüştürüldükleri için taşacak.
18:24

151

Bit karşılaştırması o kadar basit ki neredeyse anlaşılmaz;) Bu "nybble" a bakın

   8 4 2 1
   -------
   0 1 1 0 = 6  (4 + 2)
   1 0 1 0 = 10 (8 + 2)
   =======
   1 1 1 0 = 14 (8 + 4 + 2)

Bitsel ORing 6 ve 10 size 14 verecektir:

   alert(6 | 10); // should show 14

Çok kafa karıştırıcı!


16
Boolean için de çalışıyor. JS doğruyu 1, yanlışı 0 olarak yorumlar; soalert(true | false) //yields 1; alert(true | true) //yields 1; alert(false | true) //yields 1; alert(false | false) //yields 0
gordon

21

Tek bir boru bit bazında OR'dir .

OR işlemini her bit çifti üzerinde gerçekleştirir. a OR b, a veya b 1 ise 1 verir.

JavaScript, bitsel işlemlerde tamsayı olmayan sayıları keser, böylece 0|00 olarak hesaplanır .


6
Bu soruya cevap vermiyor. ("Bu neden 0
döndürüyor

9

Bu örnek size yardımcı olacaktır.

var testPipe = function(input) { 
   console.log('input => ' + input);
   console.log('single pipe | => ' + (input | 'fallback'));
   console.log('double pipe || => ' + (input || 'fallback'));
   console.log('-------------------------');
};

testPipe();
testPipe('something'); 
testPipe(50);
testPipe(0);
testPipe(-1);
testPipe(true);
testPipe(false);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.