Java برای دستکاری بیتهای یک نوع صحیح (یعنی byte، short، int، long یا char) عملگرهایی دارد.
برای جابهجایی بیتها به چپ از << و برای جابهجایی به راست از >> استفاده کنید.
// Shift two places to the left
0b0000_1011 << 2;
// # => 0b0010_1100
// Shift two places to the right
0b0000_1011 >> 2;
// # => 0b0000_0010
>> را جابهجایی علامتدار یا حسابی هم مینامند، چون بیتی که درج میکند همان بیت علامت است.
این بیت، چپترین بیت است و اگر مقدار مثبت باشد ۰ و اگر منفی باشد ۱ است.
جابهجایی به چپ با << همیشه در سمت راست صفر درج میکند.
// Shift 2 places to the right preserves the sign
// The binary value is two's complement of 0b0000_0110 (or 0x00000026), so the binary representation will be
// 1000_0000_0000_0000_0000_0000_0010_0110
int value = -0x7FFFFFDA;
// Shift two places to the right, preserving the sign bit
value >> 2;
// # => 1110_0000_0000_0000_0000_0000_0000_1001
وقتی هنگام جابهجایی به راست میخواهید صفر درج شود، بهجای آن از >>> استفاده کنید.
درج صفر هنگام جابهجایی را جابهجایی منطقی هم مینامند.
// Shift two places to the right, inserting 0s on the left
value >>> 2;
// # => 0010_0000_0000_0000_0000_0000_0000_1001
عملگر AND بیتی (&) دو مقدار میگیرد و روی هر بیت یک عملیات AND انجام میدهد.
هر بیت از مقدار اول را با بیتِ همان جایگاه در مقدار دوم مقایسه میکند.
اگر هر دو ۱ باشند، بیت نتیجه ۱ میشود.
در غیر این صورت، بیت نتیجه ۰ است.
0b0110_0101 & 0b0011_1100;
// # => 0b0010_0100
عملگر OR بیتی (|) دو مقدار میگیرد و روی هر بیت یک عملیات OR انجام میدهد.
هر بیت از مقدار اول را با بیتِ همان جایگاه در مقدار دوم مقایسه میکند.
اگر یکی از آن دو ۱ باشد، بیت نتیجه ۱ میشود.
در غیر این صورت، ۰ است.
0b0110_0101 | 0b0011_1100;
// # => 0b0111_1101
عملگر XOR بیتی (^) روی دو مقدار یک XOR بیتی انجام میدهد.
مثل عملگرهای AND بیتی و OR بیتی، هر بیت از مقدار اول را با بیتِ همان جایگاه در مقدار دوم مقایسه میکند.
اگر فقط یکی از آن دو ۱ باشد، بیت حاصل ۱ میشود.
در غیر این صورت، ۰ است.
0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
~)در آخر، عملگر NOT بیتی (~) هر بیت را وارونه میکند.
برخلاف عملگرهای قبلی، این یک عملگر یکانی است و فقط روی یک مقدار عمل میکند.
~0b0110_0101;
// # => 0b1001_1010