Saya menemukan tantangan ini pada Edabit dan tidak dapat menyelesaikan solusi operasi bitwise ini.
notNotNot = (a,b) => !!(a%2 >> b)
Tantangan:
//Something which is not true is false, but something which is not not true is true!
//Create a function where given n number of "not", evaluate whether it's true or false.
//Examples:
notNotNot(1, true) ➞ false
// Not true
notNotNot(2, false) ➞ false
// Not not false
notNotNot(6, true) ➞ true
// Not not not not not not true
Saya melakukan riset bahwa operator itu:
Bergeser ke kanan dengan mendorong salinan bit paling kiri dari kiri, dan biarkan bit paling kanan jatuh.
Saya rasa saya mengerti (misalnya 5 >> 1
sama dengan 0101 >> 1
yang mengevaluasi 0010
), tapi saya tidak bisa melihat bagaimana itu bekerja dengan boolean? Saya tahu true
mengevaluasi ke 1
dan false
ke 0
.
javascript
kiabbott
sumber
sumber
true
=1
(desimal) =01
(biner) bergeser ke kiri oleh orang akan menghasilkan10
biner atau2
desimal.notNotNot(2, true)
: itu akan kembalifalse
, tetapi tidak tidak benar (!!true
) harustrue
...false
untuk diselesaikantrue
.notNotNot = (a,b) => !!((a%2)^b)
Sebagai gantinya saya akan mengatakan ...(a, b) => !!((a + b) % 2)
?Jawaban:
Fungsi yang Anda berikan tidak memuaskan tantangan. Pergeseran yang benar tidak akan melakukan apa yang diminta. Sebagai contoh, Anda
notNotNot(6,true)
yaitufalse
, tidaktrue
ketika dimasukkan melalui fungsi Anda.Pertanyaan Anda adalah tentang operasi bitwise pada boolean. Karena operator menyukai
>>
dan<<
bekerja pada bilangan bulat, Javascript terlebih dahulu mengubah nilai boolean menjadi bilangan bulat. Jaditrue
menjadi 1 danfalse
menjadi 0. Untuk melihat ini, Anda dapat menggeser nol:Menggunakan
!!
adalah cara praktis untuk mengubah apa pun menjadi boolean. Dibutuhkan apa pun yang akan dianggap setara dengan false (seperti 0null
,,undefined
atau "") dan memberikan kembalifalse
. Demikian pula segala sesuatu yang benar (seperti 14, "halo", [4], {a: 1}) dan berikan kembalitrue
.!!
bekerja karena tanda seru pertama memberikan 'tidak' dari ekspresi yang selalutrue
ataufalse
, maka tanda seru kedua memberikan kebalikan dari itu (false
atautrue
).Kembali ke tantangan, ia ingin menerapkan waktu bukan operator dan membandingkannya dengan nilai 'b'. Jadi sesuatu seperti ini akan berhasil:
sumber
if (a % 2 === 1) return !b else return b
tetapi ada seperti yang ditunjukkan dalam jawaban lain, ada cara untuk melakukannya tanpa bercabang atau loop.Operator bitwise selalu mengonversi operan mereka ke integer. Jadi,
4 >> true
sama seperti4 >> 1
yang akan melakukan sedikit bergeser ke kanan dengan satu posisiJadi, menggunakan
true
ataufalse
hanya jalan memutar untuk menggunakan1
atau0
.The
notNotNot
fungsi memiliki operasi yang sangat sederhana, secara keseluruhan:a%2
mengubah angka pertama menjadi0
genap atau1
ganjil.>> b
bergeser ke kanan dengan0
posisi untukfalse
atau1
posisi untuktrue
.a
ganjil (1) danb
isfalse
=1
a
ganjil (1) danb
istrue
=0
1
digeser ke kanan dan dibuang.a
bahkan (0) danb
adalahfalse
=0
a
bahkan (0) danb
adalahtrue
=0
0
yang 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 menghasilkanfalse
-a
bahkan danb
adatrue
. Harapannya adalah bahwa itu akan menghasilkantrue
sejak itu!!true = true
. Masalah yang sama hadir untuk nomor genap dantrue
.Itu dapat dengan mudah diperbaiki dengan menggunakan XOR bitwise bukannya shift kanan:
a
ganjil (1) danb
isfalse
=1
0
a
ganjil (1) danb
istrue
=0
1
a
bahkan (0) danb
adalahfalse
=0
0
a
bahkan (0) danb
adalahtrue
=1
1
Hanya demi kelengkapan, jika Anda menginginkan operasi bitwise sepenuhnya:
Operasi modulo
%2
dapat diubah menjadi bitwise DAN&1
mendapatkan bit terendah. Untuk bilangan genap, ini akan menghasilkan0
karena Anda akan menghitungyang merupakan nol. Dan untuk bilangan ganjil hal yang sama berlaku tetapi Anda akan mendapatkan hasilnya:
Jadi hasilnya
a&1
dana%2
identik. Lebih lanjut, meskipun operasi bitwise mengubah angka menjadi integer bertanda 32-bit yang tidak masalah karena paritas akan dipertahankan.Tampilkan cuplikan kode
sumber
Pertama,
(a,b) => !!(a%2 >> b)
tidak cocok dengan hasil contoh. Saya akan memecah apa yang dilakukan dengan menggunakannotNotNot(6, true) ➞ true
.a%2
, cukupa
bagi dengan 2 kembalikan sisanya. Jadi kita akan mendapatkan 0 untuk bilangan genap dan 1 untuk bilangan ganjil.a = 6
a%2 = 0
pada kasus ini.0 >> b
geser 1 angka dari kanan karena seperti yang Anda katakantrue
bernilai1
. Jadi kita dapatkan0 >> 1 = 0
.!!(0)
, sederhana, dan dapat dipecah seperti itu!0 = true
, lalu!true = false
.Jadi jika kita memikirkan ini selama
b
initrue
, kita akan selalu kembalifalse
. Katakanlah kita memiliki = 5, b = true mengevaluasi untuk5%2 = 1
,1 >> 1 = 0
. Anda dapat melihat karena mod (%2
) kita hanya akan memiliki 1 atau 0 (hanya pernah memiliki 1 digit) dan true akan selalu mematikan 1 ketika kita memilikinya.Cara sederhana untuk melihat masalah ini seperti sebuah
isEvenOrNot
fungsi. Begitua
juga nomor yang kami periksa danb
merupakan boolean untuk memeriksa apakah itu genap (benar) atau bahkan genap (salah). Ini berfungsi karena setiap detik yangnot
ditambahkan akan benar.Jadi solusi menggunakan bitwise bisa menjadi sesuatu seperti:
(a,b) => !!(a&1 ^ b)
. Saya akan membiarkan Anda bersenang-senang menguraikan mengapa itu berhasil! :)Sedikit lagi menjelaskan bagaimana shift bekerja dengan boolean. Jadi
true
seperti yang Anda katakan akan menjadi 1 dan false akan menjadi 0. Jadi seperti yang ditunjukkan dalam contoh Anda,0101 >> true
sama dengan0101 >> 1
.Saya harap ini membantu.
Saya menggunakan yang berikut sebagai referensi untuk bitwise: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
sumber
NB Untuk salah satu boolean, jumlah TIDAK yang rata menghasilkan boolean asli, jumlah TIDAK yang aneh menghasilkan boolean yang berlawanan
LSB dari nomor mana pun menentukan apakah nomor tersebut ganjil atau genap. (0 genap, 1 ganjil)
sumber
Saya melihat bahwa tugas Anda adalah:
Saya tidak tahu mengapa Anda menulis
notnotnot
fungsi untuk saya bukan itu tugasnya.Jadi sesuai dengan tugas saya membuat fungsi
not
yang menerima sejumlah "tidak" dan mengevaluasi mereka.Cara pertama
Cara kedua menggunakan XOr (^)
Cara ketiga menggunakan Mod (%) yang ditunjukkan oleh @VLAZ
Cara keempat menggunakan bitwise And (&)
Uji
sumber
n
- hanya apakah itu genap atau ganjil, karena ada dua TIDAK yang dibatalkan, begitu!!!!!b
juga dengan!b
. Karenanya kita tidak perlu loop jika kita hanya mengambiln%2
- kita akan mendapatkan1
untuk TIDAK dan0
untuk "tetap sama". Karena kita memiliki nomor, kita bisa melakukan operasi bitwiseMari kita analisis solusi
Sekarang analisis untuk
(a,b) => !!(a%2 >> b)
Thats di sarana ini tidak bekerja untuk
notNotNot(6, true)
adalahtrue
tetapi solusi saat memberikanfalse
.Kami dapat Anda
^
(XOR) operator untuk membuatnya Seperti benar(a,b) => !!(a%2 ^ b)
Sekarang analisis untuk
(a,b) => !!(a%2 ^ b)
Contoh:
sumber