In everyday Java development, bit operations use little, more arithmetic operations (+ 、-、 *,/,%), relational operations (<, >, <=, >=, = =,! =), and logical operations (&&, | |,!), Therefore, relative to the bit operation is not so familiar with, this article will use Java bit operation to detail the next operation and its application.
1. bit Operation Origin
Bit operations originate from the low-level operation of the C language, and Java is designed to be embedded in the TV set-top box, so this low-level operation is preserved. The so-called low-level operation is because the operand of the bitwise operation is bits, but this kind of low-level operation is very simple, direct, and friendly and efficient for the computer. On simple low-cost processors, bit operations are usually much faster than division, several times faster than multiplication, and sometimes much faster than addition. Although modern processors typically perform addition and multiplication at the same speed as bit operations due to lengthy instruction pipelining and other architectural design choices, bit operations often use less power due to reduced resource usage, so clever use of bit operations in some Java underlying algorithms can reduce the overhead of running a lot.
2. bit Operation detailed
The subdivision of Java bit operations can be divided into bitwise operations and shift operations, as shown in the table below.
Refinement |
Symbol |
Describe |
Arithmetic rules |
Bitwise operations |
& |
And |
Two bits are 1, so the result is 1. |
| |
Or |
One is 1, so the result is 1. |
~ |
Non - |
~0 = 1,~1 = 0 |
^ |
XOR or |
Two bits are different, the result is 1 |
Shift Operations |
<< |
Move left |
All bits left n bits, high drop, low 0 |
>> |
Move right |
Each bits all right shift n bit, if the value is positive, then inserts 0 at the high, if the value is negative, then inserts 1 in the high position |
>>> |
Unsigned Right Shift |
Each bits all right shift n bits, both positive and negative, are inserted in the high 0 |
Before the bit operation in detail, the first to popularize the digital representation of the computer. For the computer, all things are 0, 1, all the numbers will eventually be converted to 0, 1 of the expression, there are 3 forms of embodiment, namely: the original code, anti-code and complement .
Original code: The original code notation in front of the number of a sign, that is, the highest bit is the sign bit, the positive digits of the bit is 0, the negative digits of the bit is 1. For example, the decimal 5 if 8 bits means that 00000101,-5 is 10000101.
Anti-code: the inverse of a positive number is its own, negative anti-code in its original code on the basis of the symbol bit unchanged, the remaining bits are reversed. 5 of the inverse code is 00000101, and 5 is 11111010.
Complement: Positive complement is its own, negative complement in its original code based on the symbol bit unchanged, the rest of you take the counter, the last +1. That is, on the basis of the anti-code +1. 5 of the inverse code is 00000101, and 5 is 11111011.
After understanding these concepts, we will now remember a conclusion, that is, in the computer system, the numbers are used in the complement to express, compute and storage, the specific reasons can see the discussion of this article, there is no more discussion here, because it is not the focus of this article.
2.1 and Arithmetic (&)
Rule: After converting to binary, two bits is 1, then the result is 1, otherwise the result is 0.
Example:
Decimal |
Binary (positive source code, inverse code, complement) |
10 |
00000000000000000000000000001010 |
&12 |
&00000000000000000000000000001100 |
= |
= |
8 |
00000000000000000000000000001000 |
Decimal |
Binary (original code) |
-6 |
10000000000000000000000000000110 |
&-2 |
&10000000000000000000000000000010 |
Decimal |
Binary (anti-code) |
-6 |
11111111111111111111111111111001 |
&-2 |
&11111111111111111111111111111101 |
Decimal |
Binary (complement) |
-6 |
11111111111111111111111111111010 |
&-2 |
&11111111111111111111111111111110 |
= |
= |
-6 |
11111111111111111111111111111010 |
The final result of the calculation 11111111111111111111111111111010 or the complement of the form, to see its decimal, but also need to first turn into binary source code.
First turn the anti-code: 11111111111111111111111111111010-1=11111111111111111111111111111001, have anti-code 11111111111111111111111111111001.
Re-transfer the original code: on the basis of the anti-code to the original code, the sign bit unchanged, the other members to take the reverse, get 10000000000000000000000000000110. The first digit 1 represents a negative number, followed by 0110 turns to decimal is 6, to 6.
2.2 or Arithmetic (|)
Rule: After converting to binary, there is a one of 1, then the result is 1, otherwise the result is 0.
Example:
Decimal |
Binary (positive source code, inverse code, complement) |
10 |
00000000000000000000000000001010 |
|12 |
|00000000000000000000000000001100 |
= |
= |
14 |
00000000000000000000000000001110 |
Decimal |
Binary (original code) |
-6 |
10000000000000000000000000000110 |
|-2 |
|10000000000000000000000000000010 |
Decimal |
Binary (anti-code) |
-6 |
11111111111111111111111111111001 |
|-2 |
|11111111111111111111111111111101 |
Decimal |
Binary (complement) |
-6 |
11111111111111111111111111111010 |
|-2 |
|11111111111111111111111111111110 |
= |
= |
-2 |
11111111111111111111111111111110 |
2.3 Non-arithmetic (~)
Rule: After converting to binary, ~0 = 1,~1 = 0.
Example:
Decimal |
Binary (positive source code, inverse code, complement) |
The |
~00000000000000000000000000000111 |
= |
= |
-8 |
11111111111111111111111111111000 (the complement needs to be converted to the original code) |
11111111111111111111111111111000-1 have anti-code, you can think of 1000 as 0112, the anti-code 11111111111111111111111111110111. According to the inverse code of the original code 10000000000000000000000000001000.
Decimal |
Binary (original code) |
~ (-6) |
~10000000000000000000000000000110 |
Decimal |
Binary (anti-code) |
~ (-6) |
~11111111111111111111111111111001 |
Decimal |
Binary (complement) |
~ (-6) |
~11111111111111111111111111111010 |
= |
= |
5 |
00000000000000000000000000000101 (positive source code, inverse code, the same complement) |
2.4 xor operation (^)
Rule: After converting to binary, the two bits are different, the result is 1, otherwise 0.
Example:
Decimal |
Binary (positive source code, inverse code, complement) |
15^2 |
00000000000000000000000000001111 ^00000000000000000000000000000010 |
= |
= |
13 |
00000000000000000000000000001101 |
2.5 left Shift operation (<<)
Rule: After converting to binary, each bits all left n bits, high drop, low 0.
Example:
Decimal |
Binary (positive source code, inverse code, complement) |
2<<2 |
00000000000000000000000000000010 |
= |
000000000000000000000000000010xx |
8 |
00000000000000000000000000001000 |
Decimal |
Binary (first complement and complement operation shift) |
-2<<2 |
10000000000000000000000000000010 (original code) |
|
11111111111111111111111111111101 (anti-code) |
|
11111111111111111111111111111110 (complement) |
|
111111111111111111111111111110xx |
|
11111111111111111111111111111000 (complement) |
|
11111111111111111111111111110111 (anti-code) |
-8 |
10000000000000000000000000001000 (original code) |
2.6 Right Shift operation (>>)
Rule: After turning to binary, each bits all right shifts n bits, if the value is positive, then inserts 0 at the high position, if the value is negative, then inserts 1 in the high position.
Example:
Decimal |
Binary (positive source code, inverse code, complement) |
2>>2 |
00000000000000000000000000000010 |
= |
xx000000000000000000000000000000 |
0 |
00000000000000000000000000000000 |
Decimal |
Binary (first complement and complement operation shift) |
-6>>2 |
10000000000000000000000000000110 (original code) |
|
11111111111111111111111111111001 (anti-code) |
|
11111111111111111111111111111010 (complement) |
|
111111111111111111111111111110 |
|
11111111111111111111111111111110 (complement) |
|
11111111111111111111111111111101 (anti-code) |
-2 |
10000000000000000000000000000010 (original code) |
2.7 Unsigned Right Shift operation (>>>)
Rule: After turning to binary, each bits all right shift n bits, both positive and negative, are inserted in the high 0.
Example:
Decimal |
Binary (first complement and complement operation shift) |
-1>>>1 |
10000000000000000000000000000001 (original code) |
|
11111111111111111111111111111110 (anti-code) |
|
11111111111111111111111111111111 (complement) |
|
011111111111111111111111111111111 |
|
01111111111111111111111111111111 (complement) |
|
01111111111111111111111111111110 (anti-code) |
Overflow, can only represent a maximum value of 2147483647 to int |
10000000000000000000000000000001 (original code) |
3. Application
3.1 No additional variables for two-digit interchange
See Resources for Bitoperationtest, method reverse the substitution of two variable values through three XOR operations.
The proof is simple, we just need to understand that the XOR operation satisfies the following law (actually not only the following rules):
0^a = A,a^a = 0;
a ^ B = b ^ A;
A ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ C;
A ^ b ^ a = b;
Suppose A, B, two variables, the following steps to complete the value exchange: A=a^b,b=b^a,a=a^b.
The proof is as follows:
Because a ^ b = b ^ A, and a=a^b,b=b^a. Therefore b=b^a= b^ (a^b) =a.
Continue a=a^b,a= (a^b) ^ b^ (a^b), so a=b. Completes the value Exchange.
3.2 Absolute value without judgment statement implementation
The formula is as follows: (a^ (A>>31))-(A>>31)
First of all, the idea of using bit operation to get absolute value: If A is positive, then it is invariant, need to use XOR or 0 to maintain the characteristics; If a is negative, then its complement for the original code flip each bit after + 1, first seek its original code, complement-1 and then flip each bit, at this time need to use XOR or 1 has
Any positive number left after 31 only sign bit 0, the final result is 0, any negative number shifted right 31 is only left sign bit 1, overflow 31 bit truncation, vacated 31 bit complement sign bit 1, the final result is-1. Move right 31 to get the sign bit for any integer.
Then combine the above steps to get the formula. A>>31 obtains a symbol, if a is positive, a>>31 equals 0,a^0=a, unchanged; If a is negative, a>>31 equals-1, a^-1 flips each bit.
3.3 Determining the parity of a number
The pseudo-code is as follows:
N&1 = = 1? " Odd ":" Even "
The odd minimum bit is definitely 1, and 1 of the binary lowest bit is 1, the other bits are 0, so all odd and 1 and the result of the operation is definitely 1.
Resources:
Github.com/lingjiango/concurrentprogrampractice
En.wikipedia.org/wiki/bitwise_operation