Java位运算

位运算

>>> 无符号右移,第一位符号位不变,其他位用0补齐 >> 右移,整体右移,左边的用0补齐 << 左移,整体左移,右边的用0补齐 | 或:有1则1 & 与:有0则0 ^ 异或:相反为1,否则为0 ~ 取反:

写个测试 1.5以后的jdk中,Integer等数字类型内部维护了一个成员变量叫 SIZE,以Integer为例:
/** * The number of bits used to represent an {@code int} value in two's * complement binary form. * * @since 1.5 */ @Native public static final int SIZE = 32;

可以看出,Integer的长度是32位。下面是测试代码:
/** * 打印int数据的二进制 * * @param num int */ private static void printBit(int num) { for (int i = 31; i >= 0; i--) { int i1 = num & (1 << i); // 1 左移 i 位,和num进行一个&与运算,如果结果是0,则打印0,否则打印1 System.out.print(i1 == 0 ? "0" : "1"); } System.out.println(""); }

下面开始位运算:
public class BitOperationTest {/** * 打印int数据的二进制 * * @param num int */ private static void printBit(int num) { for (int i = 31; i >= 0; i--) { int i1 = num & (1 << i); // 1 左移 i 位,和num进行一个&与运算,如果结果是0,则打印0,否则打印1 System.out.print(i1 == 0 ? "0" : "1"); } System.out.println(""); }public static void main(String[] args) { int i = 10; System.out.println("i : 10"); printBit(i); int leftMove = i << 3; System.out.println("leftMove : "); printBit(leftMove); int rightMove = i >> 3; System.out.println("rightMove : "); printBit(rightMove); int unsignRightMove = i >>> 3; System.out.println("unsignRightMove : "); printBit(unsignRightMove); System.out.println("==========="); System.out.println("i : 10"); printBit(i); int j = -10; System.out.println("j : -10"); printBit(j); int or = i | j; System.out.println(" i | j : "); printBit(or); int and = i & j; System.out.println("i & j : "); printBit(and); int xor = i ^ j; System.out.println(" i ^ j : "); printBit(xor); int neg = ~ i; System.out.println(" ~ i : "); printBit(neg); } }

运行结果如下:
Java位运算
文章图片

反码、补码 在上图可以看出,-10的二进制是 11111111111111111111111111110110,这里做个解释。
第一位是符号位,0表示正数,1表示负数。先对这个二进制数取反,得到 00000000000000000000000000001001,这就是反码 ,然后在反码的基础上+1,得到 补码00000000000000000000000000001010,这个数就是二进制的10,然后加上符号位,即-10。
Java各基础数据长度 看下Integer中的代码:
/** * The number of bits used to represent an {@code int} value in two's * complement binary form. * * @since 1.5 */ @Native public static final int SIZE = 32; /** * The number of bytes used to represent a {@code int} value in two's * complement binary form. * * @since 1.8 */ public static final int BYTES = SIZE / Byte.SIZE;

【Java位运算】可知Integer的二进制长度为32位,有四个字节。
类型 二进制长度 字节数 范围
byte 8 2 -128~127
short 16 4 -32768~32767
int 32 8 -2^31 ~ 2^31-1
long 64 16 -2^63~2^63-1
char 16 4 0~65535

    推荐阅读