通过一天的学习,整理了下面的小例子,分析了整数位运算的具体步骤,帮助大家理解和运用位运算符
package com.base; public class Calculate { /** * 1 int 的取值是31位,最高位表示0表示正数,1表示负数 * min = 10000000000000000000000000000000 = -2147483648 * max = 01111111111111111111111111111111 = 2147483647 * 2 负数使用补码表示,计算方法为最高位=1,其余31位为正数取反后加1 * 20 = 00000000000000000000000000010100 * 取反 11111111111111111111111111101011 * +1 * -20 = 11111111111111111111111111101100 * @param args */ public static void main(String[] args) { //------- 整数位移运算--------------------------- testLeft(2,16);// 正数左移 testLeft(-2,16);//负数左移 testRight(20,3);// 正数右移 testRight(-20,5);// 负数右移 testUnsignedRight(20,5);// 正数无符号右移 testUnsignedRight(-20,5);// 负数无符号右移 //二进制取值范围 testIntegerRag(); //int } /** * 2 << 16 * 2 = 00000000000000000000000000000010 * << 16 * 00000000000000100000000000000000 * = 131072 * * -2 << 16 * -2= 11111111111111111111111111111110 * << 16 * 11111111111111100000000000000000 * = -131072 */ private static void testLeft(int i,int n) { System.out.println(" ---------- "+i+" << "+n+" -----------------"); System.out.println("before = "+Integer.toBinaryString(i)); int a = i << n; System.out.println(" after = "+Integer.toBinaryString(a)); System.out.println("result = "+a); } /** * 4 >> 1 -- 0100 >> 0010 正数右移 * 负数右移 * -20 >> 4 11111111111111111111111111101100 * - >>4 1111111111111111111111111110 * - -1 1111111111111111111111111101 * - 取反 1000000000000000000000000010 = -2 * * -20 >> 5 11111111111111111111111111101100 * - >>5 111111111111111111111111111 * - -1 111111111111111111111111110 * - 取反 100000000000000000000000001 = -1 * @param i * @param n */ private static void testRight(int i,int n) { System.out.println(" ---------- "+i+" >> "+n+" -----------------"); System.out.println("before = "+Integer.toBinaryString(i)); int a = i >> n; System.out.println(" after = "+Integer.toBinaryString(a)); System.out.println("result = "+a); } /** * 无符号位置 * -20 >>> 5 * -20 = 11111111111111111111111111101100 * >>> 5 = 111111111111111111111111111 * 转十进制 = 134217727 * 20 >>> 5 * 20 = 00000000000000000000000000010100 * >>> 5 = 00000000000000000000000000000000 * 转十进制 = 0 * @param i * @param n */ private static void testUnsignedRight(int i,int n){ System.out.println(" ---------- "+i+" >>> "+n+" -----------------"); System.out.println("before = "+Integer.toBinaryString(i)); int a = i >>> n; System.out.println(" after = "+Integer.toBinaryString(a)); System.out.println("result = "+a); } /** * Integer 二进制取值范围 */ private static void testIntegerRag() { System.out.println(" ---------- int -----------------"); System.out.println(" "+Integer.toBinaryString(Integer.MIN_VALUE)+"="+Integer.MIN_VALUE); System.out.println(" "+Integer.toBinaryString(Integer.MAX_VALUE)+"= "+Integer.MAX_VALUE); } }