Bitsel işleçler, işlenenlerini her zaman bir tamsayıya dönüştürür. Yani, bir konum sağa biraz kaydırma yapacak 4 >> trueolanla aynı4 >> 1
(decimal) 4 = (binary) 100
(binary) 100 >> 1 = (binary) 010
(binary) 010 = (decimal) 2
Yani, kullanma trueveya falsekullanım için sadece bir dolambaçlı bir yoldur 1ya 0.
notNotNotFonksiyon genel olarak, çok basit bir işlem vardır:
a%2ilk sayıyı 0çift veya 1tek için dönüştürür .
>> b0için falseveya 1konumuna göre sağa kaydırır true.
atek (1) ve bir bolduğunu false=1
- sağa sıfır kayma var, bu yüzden sayı aynı kalıyor.
atek (1) ve bir bolduğunu true=0
- ayarlanan tek bit
1sağa kaydırılır ve atılır.
aHatta (0) ve bbir false=0
- sağa sıfır kayma var, bu yüzden sayı aynı kalıyor.
aHatta (0) ve bbir true=0
- taban numarası
0herhangi bir bit ayarlanmamıştır, bu nedenle herhangi bir miktarı doğru kaydırmak onu değiştirmez.
!!() sonucu boole'ye dönüştürür.
Bununla birlikte, buradaki çözüm yanlıştır, çünkü notNotNot(2, true)üretecek false- aeşittir ve beşittir true. O truezamandan beri üreteceği beklentisi !!true = true. Aynı problem çift sayı için de geçerlidir true.
Sağ kaydırma yerine bitsel XOR kullanılarak kolayca sabitlenebilir:
atek (1) ve bir bolduğunu false=1
- her ikisi de eşleşir, böylece
0
atek (1) ve bir bolduğunu true=0
- eşleşmiyorlar, bu yüzden
1
aHatta (0) ve bbir false=0
aHatta (0) ve bbir true=1
- eşleşmiyorlar, bu yüzden
1
notNotNot = (a,b) => !!(a%2 ^ b);
console.log("!!true = ", notNotNot(2, true))
console.log("!!!true =", notNotNot(3, true))
console.log("!!false = ", notNotNot(2, false))
console.log("!!!false = ", notNotNot(3, false))
//bonus
console.log("true = ", notNotNot(0, true))
console.log("false = ", notNotNot(0, false))
Tamamen bitmek için, tamamen bitsel bir işlem istiyorsanız:
Modulo işlemi %2bitsel olarak değiştirilebilir VE &1en düşük biti alır. Çift sayılar için, 0hesaplama yapacağınızdan bu elde edilir
xxx0
&
0001
ki bu sıfır. Ve tek sayılar için aynı şey geçerlidir, ancak sonuç olarak bir tane alırsınız:
xxx1
&
0001
Yani sonuçları a&1ve a%2özdeş. Ayrıca, bitsel işlemler sayıyı parite korunacağı için önemli olmayan 32 bit işaretli bir tam sayıya dönüştürse bile .
//larger than 31 bits
const largeValue = 2**31 + 1;
//larger than 32 bits
const veryLargeValue = 2**32 + 1
console.log("2**31 + 1 =", largeValue);
console.log("2**32 + 1 =", veryLargeValue);
console.log("2**31 + 1 to 32-bit signed integer =", largeValue | 0);
console.log("2**32 + 1 to 32-bit signed integer = ", veryLargeValue | 0);
const isOddModulo = number =>
console.log(`(${number} % 2) can detect an odd number: ${(number % 2) === 1}`);
const isOddBitwise = number =>
console.log(`(${number} & 1) can detect an odd number: ${(number & 1) === 1}`);
isOddModulo(largeValue);
isOddBitwise(largeValue);
isOddModulo(veryLargeValue);
isOddBitwise(veryLargeValue);
true=1(ondalık) =01(ikili) bire sola kaydırıldığında10ikili veya2ondalık üretilecektir .