技巧
1、使用 x & 1 == 1 判断奇偶数。(注意,一些编辑器底层会把用%判断奇偶数的代码,自动优化成位运算)
奇数的二进制最低位皆为 1
2、不使用第三个数,交换两个数。x = x ^ y , y = x ^ y , x = x ^ y。(早些年喜欢问到,现在如果谁再问,大家会觉得很low)
3、两个相同的数异或的结果是 0,一个数和 0 异或的结果是它本身。(对于找数这块,异或往往有一些别样的用处。)
4、x & (x - 1) ,可以将最右边的 1 设置为 0。(这个技巧可以用来检测 2 的幂,或者检测一个整数二进制中 1 的个数,又或者别人问你一个数变成另一个数其中改变了多少个bit位,统统都是它)
5、异或可以被当做无进位加法使用,与操作可以用来获取进位。
- (两数相加不使用加号):LeetCode : 面试题 17.01. 不用加号的加法
6、i+(~i)=-1,i 取反再与 i 相加,相当于把所有二进制位设为1,其十进制结果为-1。
7、对于int32而言,使用 n >> 31取得 n 的正负号。并且可以通过 (n ^ (n >> 31)) - (n >> 31) 来得到绝对值。(n为正,n >> 31 的所有位等于0。若n为负数,n >> 31 的所有位等于1,其值等于-1)
8、使用 (x ^ y) >= 0 来判断符号是否相同。(如果两个数都是正数,则二进制的第一位均为0,x^y=0;如果两个数都是负数,则二进制的第一位均为1;x^y=0 如果两个数符号相反,则二进制的第一位相反,x^y=1。有0的情况例外,^相同得0,不同得1)
基本知识
源码
补码
反码
位运算操作符
左右移运算符
左移运算符(相当于乘法) | 右运算符(相当于除法) | |
---|---|---|
正数 | 00001010<<2=00101000 | 00001010>>2=00000010 |
负数 | 10001010<<3=01010000 | 10001010>>3=11110001 |
- 左移运算符:不管正负数,左移动 n位时,最左边的n位将被抛弃,同时在最右边补上n个0
- 右移运算符:正数,右移之后在最左边补 0,负数,右移之后补 1
进制转换
二进制 -> 十进制
对应位置乘以 2 的位置索引次幂,整数从由往左(0 开始),负数从左到右(从 -1 开始)
abcd.efg(2)=d2+c2+b2+a2+e2+f2+g*2
十进制 -> 二进制
除2取余,逆序排列