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 a
nomer sing bit sing dipindhah, lan b
nomer sing nuduhake carane kakehan kanggo mindhah bit saka nomer a
ngiwa. Sajrone operasi iki, bit-urutan rendah sing ditambahake ing sisih tengen yaiku nol.
Tuladha:
Tuladha | asil |
---|---|
|
|
|
|
|
|
|
|
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 a
nomer sing bit lagi dipindhah, lan b
nomer kaping kanggo mindhah bit saka nomer a
menyang tengen.
Tuladha:
Tuladha | asil |
---|---|
|
|
|
|
|
|
|
|
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 !
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 0
ditambahake ing sisih kiwa yen bit paling kiwa ana 0
, lan a 1
ditambahake ing sisih kiwa yen bit paling kiwa ana 1
.
Nanging ing conto ing ndhuwur, sing ora katon minangka asil. Kenging punapa? Amarga integer literals int
s, lan bener tegese . Sing, bit paling kiwa iku nol.0b11111111
0b00000000000000000000000011111111
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 a
menyang 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 ( true
utawa false
) nilai. Siji long
kaya boolean
array 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 0b00001010
lan 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 1
kajaba kanggo bit sing pengin direset.
Contone, umpamane sampeyan duwe nomer kasebut 0b00001010
lan 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 1
kajaba sing pengin dadi nul, kita pisanan ngalih posisi 1 b ing sisih kiwa, banjur gunakake NOT
operator 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 1
ing 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 XOR
asring 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 XOR
operator 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));
}
}
GO TO FULL VERSION