Toán tử bitwise luôn chuyển đổi toán hạng của chúng thành một số nguyên. Vì vậy, 4 >> truegiống như 4 >> 1sẽ làm một chút thay đổi ngay tại một vị trí
(decimal) 4 = (binary) 100
(binary) 100 >> 1 = (binary) 010
(binary) 010 = (decimal) 2
Vì vậy, sử dụng truehoặc falsechỉ là một cách vòng để sử dụng 1hoặc 0.
Các notNotNotchức năng có hoạt động rất đơn giản, tổng thể:
a%2chuyển đổi số đầu tiên thành số 0chẵn hoặc 1lẻ.
>> bthay đổi bên phải bởi 0vị trí cho falsehoặc 1vị trí cho true.
alà số lẻ (1) và blà false=1
- không có dịch chuyển về bên phải, vì vậy số lượng vẫn giữ nguyên.
alà số lẻ (1) và blà true=0
- bit thiết lập duy nhất
1được dịch chuyển sang phải và bị loại bỏ.
alà chẵn (0) và blà false=0
- không có dịch chuyển về bên phải, vì vậy số lượng vẫn giữ nguyên.
alà chẵn (0) và blà true=0
- số cơ sở
0không có bất kỳ bit nào được đặt, do đó, việc chuyển đúng bất kỳ số tiền nào sẽ không thay đổi nó.
!!() chuyển đổi kết quả thành boolean.
Như đã nói, giải pháp ở đây là sai, vì notNotNot(2, true)sẽ sản xuất false- alà thậm chí và blà true. Kỳ vọng là nó sẽ sản xuất truekể từ đó !!true = true. Vấn đề tương tự hiện diện cho bất kỳ số chẵn và true.
Nó có thể dễ dàng được sửa bằng cách sử dụng XOR bitwise thay vì dịch chuyển phải:
alà số lẻ (1) và blà false=1
- cả hai khớp nhau, vì vậy chúng được lật sang
0
alà số lẻ (1) và blà true=0
- họ không hợp nhau, vì vậy chúng tôi nhận được
1
alà chẵn (0) và blà false=0
- cả hai trận đấu, vì vậy chúng tôi nhận được
0
alà chẵn (0) và blà true=1
- họ không hợp nhau, vì vậy chúng tôi nhận được
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))
Chỉ vì lợi ích hoàn toàn, trong trường hợp bạn muốn thao tác hoàn toàn theo bit:
Hoạt động modulo %2có thể được thay đổi thành bitwise VÀ &1lấy bit thấp nhất. Đối với các số chẵn, điều này sẽ mang lại 0vì bạn đang tính toán
xxx0
&
0001
bằng không. Và đối với các số lẻ áp dụng tương tự, nhưng bạn sẽ nhận được một kết quả:
xxx1
&
0001
Vì vậy, kết quả của a&1và a%2là giống hệt nhau. Hơn nữa, mặc dù các phép toán bitwise chuyển đổi số thành số nguyên có chữ ký 32 bit không quan trọng vì tính chẵn lẻ sẽ được giữ nguyên.
//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(thập phân) =01(nhị phân) được dịch chuyển bởi một người sẽ tạo ra10nhị phân hoặc2thập phân.