public class Test { public static void main(String[] args) { // 1、左移( << ) // 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0:// // 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20 System.out.println(5 << 2);// 运行结果是20 // 2、右移( >> ) 高位补符号位 // 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0: // 0000 0000 0000 0000 0000 0000 0000 0001 System.out.println(5 >> 2);// 运行结果是1 // 3、无符号右移( >>> ) 高位补0 // 例如 -5换算成二进制后为:0101 取反加1为1011 // 1111 1111 1111 1111 1111 1111 1111 1011 // 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位: System.out.println(5 >> 3);// 结果是0 System.out.println(-5 >> 3);// 结果是-1 System.out.println(-5 >>> 3);// 结果是536870911 // 4、位与( & ) // 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0 System.out.println(5 & 3);// 结果为1 System.out.println(4 & 1);// 结果为0 // 5、位或( | ) // 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0 System.out.println(5 | 3);// 结果为7 // 6、位异或( ^ ) // 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0 System.out.println(5 ^ 3);//结果为6 // 7、位非( ~ ) // 操作数的第n位为1,那么结果的第n位为0,反之。 System.out.println(~5);// 结果为-6 } }
1 public class SuanFaTest { 2 3 //此方法的时间复杂度是O(LogN) 4 public static boolean ispowerOf2_(Integer number) { 5 int temp = 1; 6 while (temp <= number) { 7 if (temp == number) { 8 return true; 9 } 10 //左移一位 数学意义等同于乘以2 11 temp = temp * 2; 12 } 13 return false; 14 } 15 16 //此方法的时间复杂度是O(LogN) 17 public static boolean ispowerOf2_initiate(Integer number) { 18 int temp = 1; 19 while (temp <= number) { 20 if (temp == number) { 21 return true; 22 } 23 //左移一位 数学意义等同于乘以2 24 temp = temp << 1; 25 } 26 return false; 27 } 28 29 //算法时间复杂度是O(1) 30 public static boolean isPowerOf2_final(Integer number) { 31 return (number & number - 1) == 0; 32 } 33 34 public static void main(String[] s){ 35 System.out.println(ispowerOf2_(7)); 36 System.out.println(ispowerOf2_initiate(7)); 37 System.out.println(isPowerOf2_final(7)); 38 } 39 }
带符号右移就是将那个数转为2进制然后在前面补0或1
如果是正数就补0
负数补1
右移一位相当于除2,右移n位相当于除以2的n次方。
加密
1 一个数异或同一个数两次还是原数;
/** * Created by YaoJia on 2016/11/24 0024. */ public class YiHuo { public static void main (String[] aa){ System.out.println(); int a=1; int b=2; System.out.println("a:"+a +" "+ "b:"+b); a = a ^ b; System.out.println("a = a ^ b之后-->"+"a:"+a +" "+ "b:"+b); b = a ^ b; //实际上是(a^b)^b 也就是a异或了b两次,等号右边是a的值 System.out.println("b = a ^ b之后-->"+"a:"+a +" "+ "b:"+b); a = a ^ b; //此时b里面已经是“果汁”,实际上是(a^b)^a,也就是b异或了a两次,是b System.out.println("a = a ^ b之后-->"+"a:"+a +" "+ "b:"+b); } }