Cara bermain Saklar Lampu
- Baca instruksi level. Di level saklar, ketuk saklar untuk menyalakan atau mematikan lampu.
- Di level ekspresi, tulis satu ekspresi JavaScript seperti
0b101atauizin & 0b100. Lampu hasilnya langsung menyala saat kamu mengetik. - Lampu putus-putus hijau adalah target yang belum menyala. Lampu merah dicoret adalah lampu yang harus dimatikan.
- Untuk operator bitwise, arena menampilkan kedua sisi dan hasilnya dalam kolom yang sejajar, jadi kamu bisa membandingkan bit per bit.
- Tekan Cek jawaban, atau Ctrl + Enter di kotak ekspresi. Kalau belum pas, pesannya menyebut lampu mana yang salah.
- Kalau buntu, buka Petunjuk. Petunjuk pertama mengarahkan, petunjuk terakhir hampir menjawab.
- Level yang sudah selesai tetap tercentang saat kamu kembali dengan browser yang sama.
Yang kamu pelajari
- Level 1
Bit dan nilai tempat
Satu bit hanya nyala atau mati. Posisinya menentukan nilai: 1, 2, 4, 8, dan seterusnya, masing-masing dua kali yang di kanannya.
- Level 2
Membaca biner
Nilai bilangan biner adalah jumlah nilai tempat yang menyala, mis.
00101010= 32 + 8 + 2 = 42. - Level 3
Desimal ke biner
Mulai dari nilai tempat terbesar yang masih muat, kurangi, lalu ulangi dengan sisanya.
- Level 4
Literal 0b
JavaScript membaca
0b1101sebagai angka 13. Nol di depan boleh dibuang. - Level 5
toString(2)
Mengubah angka jadi teks biner. Bungkus angkanya dengan kurung:
(37).toString(2). - Level 6
parseInt(teks, 2)
Mengubah teks biner jadi angka. Tanpa basis 2, teksnya dibaca sebagai desimal.
- Level 7
Heksadesimal
Satu digit hex mewakili 4 bit, jadi satu byte ditulis dua digit seperti
ffatau88di warna#ff8800. - Level 8
AND (&) dan mask
&hanya menyalakan bit yang menyala di kedua sisi, jadi cocok untuk mengecek satu bit seperti izin r. - Level 9
OR (|)
|menyalakan bit yang menyala di salah satu sisi, untuk menambah izin tanpa mengubah yang lain. - Level 10
XOR (^)
^membalik bit di posisi yang menyala di mask: nyala jadi mati, mati jadi nyala. - Level 11
Geser kanan (>>)
>>menggeser semua bit ke kanan. Geser 4 langkah mengambil 4 bit kiri dari satu byte. - Level 12
Geser kiri (<<) dan batas 8 bit
<<menggeser bit ke kiri. Satu byte hanya muat 0 sampai 255, jadi bit yang luber dibuang dengan& 0xff.
Biner, desimal, dan hex adalah angka yang sama
42, 0b101010, dan 0x2a bukan tiga angka berbeda. Ketiganya cara menulis nilai yang sama, dan JavaScript menyimpan hasilnya sebagai angka yang sama persis. Itu sebabnya 0b101010 === 42 bernilai true.
Yang berbeda adalah teks. (42).toString(2) menghasilkan teks "101010", bukan angka, jadi "101010" & 1 tidak membaca bitnya seperti yang kamu kira. Ubah teks kembali jadi angka dengan parseInt(teks, 2) sebelum memakai operator bitwise.
Tanya jawab
Apakah harus daftar akun untuk bermain?
Tidak. Semua level bisa dimainkan tanpa akun. Kemajuanmu disimpan di browser yang kamu pakai, jadi akan hilang kalau data browser dihapus.
Apakah ekspresiku dijalankan sebagai JavaScript?
Tidak langsung. Game ini membaca ekspresimu dengan pengurai kecil yang hanya mengenal angka, 0b, 0x, variabel level, +, -, &, |, ^, <<, >>, kurung, parseInt, dan toString. Hasilnya sama dengan console browser, tapi kode lain tidak ikut dijalankan.
Kenapa 8 bit hanya sampai 255?
Kalau 8 lampu menyala semua, jumlahnya 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255. Angka 256 butuh lampu ke-9. Ditambah 0, satu byte punya 256 kemungkinan nilai.
Apakah JavaScript menyimpan angka dalam 8 bit?
Tidak. Angka JavaScript adalah float 64 bit, dan operator bitwise bekerja di 32 bit. Batas 8 bit muncul saat data disimpan sebagai byte, misalnya di Uint8Array, kanal warna, atau file gambar. Karena itu hasil << perlu dipotong dengan & 0xff.
Di mana operator bitwise dipakai dalam pekerjaan sehari-hari?
Izin berkas rwx di Linux, flag pilihan yang digabung dalam satu angka, kanal warna #rrggbb, protokol jaringan, dan kompresi data. Di aplikasi web biasa, kamu lebih sering membacanya daripada menulisnya.
Kenapa 37.toString(2) error?
Titik sesudah angka dibaca JavaScript sebagai koma desimal, jadi 37. dianggap angka dan toString jadi tidak terduga. Tulis (37).toString(2) atau 37 .toString(2).