300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 常见的位运算技巧

常见的位运算技巧

时间:2021-07-08 09:53:14

相关推荐

常见的位运算技巧

1. 利用或操作|和空格将英文字符转换为小写

@Testpublic void test() {System.out.println(('a' | ' ') == 'a');//trueSystem.out.println(('A' | ' ') == 'a');//true}

2. 利用与操作&和下划线将英文字符转换为大写

@Testpublic void test02(){System.out.println(('b' & '_') == 'B');//trueSystem.out.println(('B' & '_') == 'B');//true}

3. 利用异或操作^和空格进行英文字符大小写互换

@Testpublic void test03(){System.out.println(('d' ^ ' ') == 'D');//trueSystem.out.println(('D' ^ ' ') == 'd');//true}

4. 判断两个数是否异号

@Testpublic void test04(){int x = -1, y = 2;boolean f = ((x ^ y) < 0); // trueint xx = 3, yy = 2;boolean flag = ((xx ^ yy) < 0); // false}

如果不用位运算来判断是否异号,需要使用 if else 分支,还挺麻烦的。

5.不用临时变量交换两个数

@Testpublic void test05() {int a = 1, b = 2;a ^= b;b ^= a;a ^= b;System.out.println("a="+a+",b="+b);// 现在 a = 2, b = 1}

6.算法常用操作

n&(n-1)这个操作是算法中常见的,作用是消除数字n的二进制表示中的最后一个 1。

其核心逻辑就是,n - 1一定可以消除最后一个 1,同时把其后的 0 都变成 1,这样再和n做一次&运算,就可以仅仅把最后一个 1 变成 0 了。

7. 判断一个数是不是 2 的指数

一个数如果是 2 的指数,那么它的二进制表示一定只含有一个 1:

2^0 = 1 = 0b00012^1 = 2 = 0b00102^2 = 4 = 0b0100

如果使用位运算技巧就很简单了(注意运算符优先级,括号不可以省略):

public boolean isPowerOfTwo(int n) {if (n < 0) {return false;}return (n & (n - 1)) == 0;}

8.查找只出现一次的元素

这里就可以运用异或运算的性质:

一个数和它本身做异或运算结果为 0,即a ^ a = 0;一个数和 0 做异或运算的结果为它本身,即a ^ 0 = a

对此,我们只要把所有数字进行异或,成对儿的数字就会变成 0,落单的数字和 0 做异或还是它本身,所以最后异或的结果就是只出现一次的元素:

public int singleNumber(int[] arr) {int result = 0;for (int data : arr) {result ^= data;}return result;}

10.乘以2的m次方

/*** 10.乘以2的m次方*计算n*(2^m)* @param n* @param m*/@Testpublic void mulTwoPower(int n, int m){int res = n << m;System.out.println(res);}

11.除以2的m次方

/*** 11.除以2的m次方* 计算n/(2^m)* @param n* @param m*/@Testpublic void divTwoPower(int n, int m){int res = n >> m;System.out.println(res);}

12.判断一个数的奇偶性

/*** 12.判断一个数的奇偶性** @param n* 奇数的话,返回true,偶数的话,返回false*/@Testpublic void isOldNumber(int n){boolean res = (n&1) == 1;System.out.println(res);}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。