"Halo, Amigo!"

"Aku uga pengin ngomong babagan bitmasks lan XOR."

"Sampeyan wis ngerti yen angka kalebu bit lan sampeyan bisa nindakake macem-macem operasi ing bit kasebut. Bitmask minangka perwakilan saka sawetara nilai logis sing beda (nilai bener / salah) minangka integer siji. Ing kasus iki, saben nilai boolean cocog karo bit tartamtu. Mangkene carane iki bisa ditindakake:"

"Perwakilan binar saka kakuwasan loro (1, 2, 4, 8, 16, 32, ...) mung kalebu nyetel siji bit:"

Nomer Perwakilan binar
1 0000 0001
2 0000 0010
4 0000 0100
8 0000 1000
16 0001 0000
19 (dudu kekuwatan loro) 0001 0011
31 (dudu kekuwatan loro) 0001 1111

"Dadi, sembarang integer bisa dianggep minangka array saka bit utawa array saka nilai boolean."

"Iki carane sampeyan bisa nyimpen macem-macem nilai boolean ing siji nomer:"

Nilai Boolean
boolean a = true;
boolean b = false;
boolean c = true;
boolean d = false;
Nilai sing dikemas dadi siji nomer:
int result = 0;
 if (a) result += 1; // 1 == 20 — bit 0
 if (b) result += 2; // 2 == 21 — bit 1
 if (c) result += 4; // 4 == 22 — bit 2
 if (d) result += 8; // 8 == 23 — bit 3

"Saiki saben bit 1 yen variabel boolean sing cocog bener."

Ing kasus kita, variabel a lan c bener, dadi asile padha karo 1+4 == 5

0000 0101
0000 dcba

"Aku rumangsa ngerti apa sing kedadeyan."

“Lha yen wis paham, ayo diterusake”.

"Int duwe 32 bit. Salah sijine digunakake kanggo tandha nomer, lan 31 liyane bisa digunakake kanggo nyimpen nilai 31 variabel boolean."

"A long wis 64 bit ngendi kita bisa nyimpen 63 variabel boolean."

"Ya wis."

"Welasan variabel crammed menyang siji nomer. Sing cukup sawetara."

"Nanging iki ditrapake ing ngendi?"

"Utamane ing kahanan sing sampeyan kudu nyimpen akeh informasi babagan obyek. Nalika sampeyan nyimpen akeh informasi babagan obyek, mesthi ana sawetara rolas variabel boolean. "Kanthi pendekatan iki, kabeh disimpen kanthi gampang ing siji nomer. ."

"Kanthi nekanake tembung 'disimpen'. Amarga bener nggunakake nomer ora trep."

"Ngomong-ngomong, iki mung sing dakkarepake. Kepiye carane ngekstrak nilai boolean saka nomer kasebut?"

"Iku ora rumit ing kabeh. Ayo dadi ngomong sampeyan kudu nemtokake apa bit 6 disetel kanggo 1 (2 kanggo daya lima iku 32). Kita bisa mriksa kaya iki: "

Gabungke nomer dadi siji:
int a = 32; // 25 == 0010 0000
int b = 8; // 23 == 0000 1000
int c = 2; // 21 == 0000 0010

int result = a + b + c; // 32 + 8 + 2 == 42 == 0010 1010
Ekstrak nilai kanthi mriksa bit tartamtu:
int a = result & 32; // 0010 1010 & 0010 0000 = 0010 0000
int b = result & 8; // 0010 1010 & 0000 1000 = 0000 1000
int c = result & 2; // 0010 1010 & 0000 0010 = 0000 0010

"Mangkono, nggarap bitmasks kalebu telung operasi:"

1)  Setel bit tartamtu kanggo 0

2)  Setel bit tartamtu kanggo 1

3)  Priksa nilai bit tartamtu.

"Cokot 6, contone."

"Carane sampeyan nyetel bit 6 kanggo 1?"

Kode Katrangan
result = result | 01000000;
result |= 01000000;
Carane sampeyan nyetel bit 6 kanggo 1?
result = result & 10111111;
result &= 10111111;
Carane sampeyan nyetel bit 6 kanggo 0?
c = result & 01000000;
Kepiye carane entuk nilai bit 6?

"Sing banget mboten umum, nanging ora angel. Man, saiki aku dadi programmer panas."

"Lan tip liyane babagan carane gampang entuk nomer kanthi bit tartamtu disetel menyang 0 utawa 1: 01000000 utawa 10111111."

Kanggo iki, kita duwe  operator >> lan  << .

"1 punika 2 kanggo daya zeroth. Ing tembung liyane, nomer karo dicokot 0 nyetel kanggo 1. We kudu nomer karo dicokot 6 pesawat."

int c = 1 << 6; // 0000 0001 << 6 == 0100 0000 == 64

"Keren! Iku pancene mbiyantu kanggo kasus kaya mengkono."

"Nanging yen aku butuh nomer sing saben bit disetel dadi 1 kajaba siji bit tartamtu disetel dadi 0?"

"Iki uga ora angel:"

int d = ~(1 << 6); // ~0100 0000 == 10111111

"Ing tembung liyane, kabeh iku prasaja banget:"

Kode Katrangan
result = result | (1 << 6);
result |= (1 << 6);
Carane sampeyan nyetel bit 6 kanggo 1?
result = result & ~(1 << 6);
result &= ~(1 << 6);
Carane sampeyan nyetel bit 6 kanggo 0?
c = result & (1 << 6);
Kepiye carane entuk nilai bit 6?

"Iku ora katon angel banget. Nanging aku ora bakal langsung ngelingi."

"Nanging, yen sampeyan nemokake ekspresi medeni kayata "hasil &= ~ (1 << 6)" ing kode wong liya, sampeyan bakal ngerti yen wong iki mung nggarap bitmask."

"Lan yen sampeyan kerep nemoni, banjur bakal ngelingi dhewe kanggo sampeyan."

"Eling dhewe... Sing muni apik. Matur nuwun kanggo pelajaran."