1. Bitwise shift ngiwa

Jawa uga wis 3 operator shift bitwise : Yen pancene perlu, sampeyan bisa banget gampang ngalih kabeh bit saka nomer sawetara posisi ngiwa utawa nengen.

Kanggo mindhah bit saka nomer menyang ngiwa, sampeyan kudu bitwise ngiwa operator shift . Mangkene tulisane:

a << b

Endi anomer sing bit sing dipindhah, lan bnomer sing nuduhake carane kakehan kanggo mindhah bit saka nomer angiwa. Sajrone operasi iki, bit-urutan rendah sing ditambahake ing sisih tengen yaiku nol.

Tuladha:

Tuladha asil
0b00000011 << 1
0b00000110
0b00000011 << 2
0b00001100
0b00000011 << 5
0b01100000
0b00000011 << 20
0b001100000000000000000000

Ngoper siji digit menyang ngiwa nduweni efek sing padha karo ngalikake angka kanthi 2.

Arep multiply nomer karo 16? 16 padha karo 2 4 . Dadi sampeyan mindhah angka 4 digit ngiwa


2. Bitwise shift tengen

Bit uga bisa dipindhah menyang sisih tengen. Kanggo nindakake iki, gunakake operator shift tengen bitwise . Mangkene tulisane:

a >> b

Endi anomer sing bit lagi dipindhah, lan bnomer kaping kanggo mindhah bit saka nomer amenyang tengen.

Tuladha:

Tuladha asil
0b11000011 >> 1
0b01100001
0b11000011 >> 2
0b00110000
0b11000011 >> 5
0b00000110
0b11000011 >> 20
0b00000000

Nggeser siji digit menyang tengen duwe efek sing padha karo mbagi nomer kanthi 2.

Sajrone operasi iki, bit urutan dhuwur sing ditambahake ing sisih kiwa yaiku nol, nanging ora mesthi !

Penting!

Bit paling kiwa saka nomer sing ditandatangani diarani bit tandha : yen angka kasebut positif, yaiku 0; nanging yen nomer negatif, dicokot iki 1.

Nalika mindhah bit saka nomer menyang tengen, Nilai saka bit tandha biasane uga pindah lan tandha saka nomer bakal ilang. Mulane, kanggo angka negatif (ing endi bit paling kiwa 1), bit iki entuk perawatan khusus. Nalika mindhah bit nomer menyang tengen, a 0ditambahake ing sisih kiwa yen bit paling kiwa ana 0, lan a 1ditambahake ing sisih kiwa yen bit paling kiwa ana 1.

Nanging ing conto ing ndhuwur, sing ora katon minangka asil. Kenging punapa? Amarga integer literals ints, lan  bener tegese . Sing, bit paling kiwa iku nol.0b111111110b00000000000000000000000011111111

Akeh programer sing frustasi karo prilaku shift tengen iki lan luwih seneng nomer kasebut tansah diisi karo nol. Dadi Jawa nambahake operator shift tengen liyane .

Mangkene tulisane:

a >>> b

Endi a nomer sing bit lagi dipindhah, lan b  nomer kaping kanggo mindhah bit saka nomer amenyang tengen. operator iki tansah appends nul ing sisih kiwa, preduli saka Nilai asli bit tandha saka nomer a.



3. Nggarap gendera

Programer nggawe lapangan sinau sing meh kabeh anyar adhedhasar operasi bitwise lan shift: nggarap panji.

Nalika komputer duwe memori sethithik banget, iku banget populer kanggo cram akeh informasi menyang nomer siji. Nomer dianggep minangka array bit: int 32 bit, lan dawa 64 bit.

Sampeyan bisa nulis akeh informasi ing nomer kuwi, utamané yen sampeyan kudu nyimpen logis ( trueutawa false) nilai. Siji longkaya booleanarray sing kasusun saka 64 unsur. Bit kasebut diarani panji lan dimanipulasi nggunakake operasi ing ngisor iki:

  • nyetel gendera
    (gawe bit tartamtu padha karo 1)
  • ngreset flag
    (gawe bit tartamtu padha karo 0)
  • mriksa flag
    (priksa nilai bit tartamtu)

Lan ing kene carane nindakake karo operator bitwise.

Nyetel gendera

Kanggo nyetel bit tartamtu kanggo 1, sampeyan kudu nindakake operasi bitwise UTAWA antarane nomer sing dicokot sing pengin disetel lan nomer digawe khusus, ngendi mung dicokot sing 1.

Contone, umpamane sampeyan duwe nomer kasebut 0b00001010lan sampeyan kudu nyetel bit 5th menyang 1. Ing kasus kasebut, sampeyan kudu:

0b00001010 | 0b00010000 = 0b00011010

Yen bit kaping 5 wis disetel dadi siji, mula ora ana sing diganti.

Umumé, operasi nyetel gendera bisa ditulis kaya ing ngisor iki

a | (1 << b)

Endi a nomer sing bit bakal disetel kanggo 1. Lan b posisi bit sing bakal disetel. Nggunakake operator shift kiwa iku super trep kene, wiwit sampeyan bisa langsung ngomong kang dicokot kita nggarap.

Ngreset gendéra

Kanggo ngreset bit tartamtu (yaiku nyetel menyang 0) tanpa ngganggu bit liyane, sampeyan kudu nindakake &operasi antarane nomer sing bit sing pengin direset (ie disetel kanggo 0) lan nomer khusus digawe, ngendi kabeh bit padha karo 1kajaba kanggo bit sing pengin direset.

Contone, umpamane sampeyan duwe nomer kasebut 0b00001010lan sampeyan kudu nyetel bit kaping 4 dadi 0. Ing kasus kasebut, sampeyan kudu:

0b00001010 & 0b11110111 = 0b00000010

Yen bit kaping 4 wis disetel menyang nol, mula ora ana sing bakal diganti.

Umumé, operasi ngreset gendéra bisa ditulis kaya ing ngisor iki

a & ~(1 << b)

Endi a nomer sing bit bakal direset menyang 0. Lan b posisi bit bakal dibusak.

Kanggo entuk nomer ing ngendi kabeh bit 1kajaba sing pengin dadi nul, kita pisanan ngalih posisi 1 b  ing sisih kiwa, banjur gunakake NOToperator bitwise kanggo ngowahi asil.

Priksa gendéra

Saliyane nyetel utawa ngreset gendéra tartamtu, kadhangkala sampeyan mung kudu mriksa apa gendéra tartamtu wis disetel, yaiku apa bit tartamtu padha karo 1. Iki cukup gampang ditindakake kanthi bitwise &.

Contone, umpamane sampeyan kudu mriksa apa bit 4th disetel 1ing nomer kasebut 0b00001010. Banjur sampeyan kudu nindakake iki:

if ( (0b00001010 & 0b00001000) == 0b00001000 )

Umumé, operasi mriksa gendera bisa ditulis kaya ing ngisor iki

(a & (1 << b)) == (1 << b)

Endi a nomer sing bit lagi dipriksa. Lan b posisi bit bakal dipriksa.


4. Enkripsi

Operasi bitwise XORasring digunakake dening programer kanggo enkripsi prasaja. Umumé, enkripsi kasebut katon kaya iki:

result = number ^ password;

Where number data kita arep kanggo encrypt, password nomer khusus digunakake minangka "sandi" kanggo data, lan result nomer ndhelik.

number == (number ^ password) ^ password;

Sing penting ing kene yaiku nalika XORoperator ditrapake menyang nomer kaping pindho, ngasilake nomer asli, preduli saka "sandi".

Kanggo pulih number saka encrypted result, sampeyan mung kudu nindakake operasi maneh:

original number = result ^ password;

Tuladha:

class Solution
{
   public static int[] encrypt(int[] data, int password)
   {
     int[] result = new int[data.length];
     for (int i = 0; i <  data.length; i++)
       result[i] = data[i] ^ password;
     return result;
   }

   public static void main(String[] args)
   {
     int[] data =  {1, 3, 5, 7, 9, 11};
     int password = 199;

     // Encrypt the array of data
     int[] encrypted = encrypt(data, password);
     System.out.println(Arrays.toString(encrypted));

     // Decrypt the array of data
     int[] decrypted = encrypt(encrypted, password);
     System.out.println(Arrays.toString(decrypted));
   }
}