Operator bitwise selalu mengonversi operan mereka ke integer. Jadi, 4 >> truesama seperti 4 >> 1yang akan melakukan sedikit bergeser ke kanan dengan satu posisi
(decimal) 4 = (binary) 100
(binary) 100 >> 1 = (binary) 010
(binary) 010 = (decimal) 2
Jadi, menggunakan trueatau falsehanya jalan memutar untuk menggunakan 1atau 0.
The notNotNotfungsi memiliki operasi yang sangat sederhana, secara keseluruhan:
a%2mengubah angka pertama menjadi 0genap atau 1ganjil.
>> bbergeser ke kanan dengan 0posisi untuk falseatau 1posisi untuk true.
aganjil (1) dan bis false=1
- tidak ada pergeseran ke kanan, jadi angkanya tetap sama.
aganjil (1) dan bis true=0
- bit yang diset hanya
1digeser ke kanan dan dibuang.
abahkan (0) dan badalah false=0
- tidak ada pergeseran ke kanan, jadi angkanya tetap sama.
abahkan (0) dan badalah true=0
- nomor dasar adalah
0yang tidak memiliki bit yang ditetapkan, jadi menggeser ke kanan jumlah apa pun tidak mengubahnya.
!!() mengubah hasilnya menjadi boolean.
Dengan itu, solusi di sini salah, karena notNotNot(2, true)akan menghasilkan false- abahkan dan bada true. Harapannya adalah bahwa itu akan menghasilkan truesejak itu !!true = true. Masalah yang sama hadir untuk nomor genap dan true.
Itu dapat dengan mudah diperbaiki dengan menggunakan XOR bitwise bukannya shift kanan:
aganjil (1) dan bis false=1
- keduanya cocok, jadi mereka membalik ke
0
aganjil (1) dan bis true=0
- mereka tidak cocok, jadi kita dapatkan
1
abahkan (0) dan badalah false=0
- keduanya cocok, jadi kita dapatkan
0
abahkan (0) dan badalah true=1
- mereka tidak cocok, jadi kita dapatkan
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))
Hanya demi kelengkapan, jika Anda menginginkan operasi bitwise sepenuhnya:
Operasi modulo %2dapat diubah menjadi bitwise DAN &1mendapatkan bit terendah. Untuk bilangan genap, ini akan menghasilkan 0karena Anda akan menghitung
xxx0
&
0001
yang merupakan nol. Dan untuk bilangan ganjil hal yang sama berlaku tetapi Anda akan mendapatkan hasilnya:
xxx1
&
0001
Jadi hasilnya a&1dan a%2identik. Lebih lanjut, meskipun operasi bitwise mengubah angka menjadi integer bertanda 32-bit yang tidak masalah karena paritas akan dipertahankan.
//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(desimal) =01(biner) bergeser ke kiri oleh orang akan menghasilkan10biner atau2desimal.