算法-位运算-1

1. 不用比较判断找出AB中较大的数

 1 public class getMaxWithOutCompair {
 2     public int flip(int n) {
 3         return n ^ 1;
 4     }
 5 
 6     public int sign(int n) {
 7         // 如果负数返回0 如果正数返回1
 8         return flip((n >> 31) & 1);
 9     }
10 
11     public int getMax(int a, int b) {
      // 这里可能溢出
12 int c = a - b; 13 int sign = sign(c); 14 int flip = flip(sign); 15 return a * sign + b * flip; 16 } 17 }
 1  public int getMax2(int a, int b) {
 2         int sa = sign(a); // 正数返回1 负数返回0
 3         int sb = sign(b); // 正数返回1 负数返回0
 4         int sc = sign(a - b); // // 正数返回1 负数返回0
 5         int disSab = sa ^ sb; // a 和b的符号不一样返回1 符号一样返回0
 6         int sameSab = flip(disSab); // a 和b的符号不一样返回1 符号一样返回0
 7         int returnA = disSab * sa + sameSab * sc; // a 和b的符号不一样返回1 a正数返回1 a 
 8         // 和b的符号不一样返回1 正数返回1
 9         int returnB = flip(returnA);
10         return a * returnA + b * returnB;
11 
12     }

 

2. 32位的数判断是否是2的幂 4的幂

2的幂的二进制特性 只有一位上是1其余都是0

取二进制数上最右的1的位置

N&((~N)+1) 

 

1. 求数的最右1 判断两个数是否相等

2. 数 & 数-1等于0 说明是2 的幂次方数

 

4的幂次方二进制数特征 二进制位上只有一个1,1的位置在0 2 4 6位置上

4的幂一定是2的幂

先判断二进制位上只有一个1再

数 & 0101 0101 0101 0101 0101 0101 0101 0101 (0x55555555)不等于0 是4的幂次方数

 

3. 不使用算数运算符 实现a和b的加减乘除

^ 代表无进位相加

& 左移1位代表进位信息

数取反+1 就是数的反数

 2 
 3 /**
 4  * 不使用运算符 执行加减乘除运算
 5  * <p>
 6  * 加减乘除
 7  * add , subtract , multiply and divide
 8  */
 9 public class MathOperation {
10 
11     public int add(int a, int b) {
12         int i = a;
13         while (b != 0) {
14             i = a ^ b; // 无进位相加
15             b = (a & b) << 1; // 进位信息
16             a = i;
17         }
18         return i;
19     }
20 
21     public int subtract(int a, int b) {
22         return add(a, negNum(b));
23     }
24 
25     public int negNum(int a) {
26         return add(~a, 1);
27     }
28 
    // 跟十进制乘法一样的思路 只是换成二进制 29 public int multiply(int a, int b) { 30 int res = 0; 31 while (b != 0) { 32 if ((b & 1) != 0) { 33 res = add(res, a); 34 } 35 a <<= 1; 36 b >>>= 1; 37 } 38 return res; 39 } 40 41 public int divide(int a, int b) { 42 int res = 0; 43 for (int i = 31; i > -1; i = subtract(i, 1)) {
          // a >> 1为了避免溢出
44 if ((a >> i) >= b) {
            // 满足条件说明i位置上可以至为1
45 res |= (1 << i);
            // a减去b
46 a = subtract(a, b << i); 47 } 48 } 49 return res; 50 } 51 52 }

 

posted @ 2021-07-28 17:21  rudynan  阅读(42)  评论(0编辑  收藏  举报