再此之前我们先了解一下数在计算机中存储的规则
原码:直接按照正负数的形式翻译成二进制得到的就是原码
反码:将原码的符号位保持不变,其他位按位取反得到反码
补码:反码+1得到补码
注意:正数和负数的原反补规格不相同,正数的反码补码和原码相同,负数的则遵循以上原则,数据在内存中以二进制补码的形式进行计算
直观图
1.移位操作符(移动的是二进制数)
1.1 <<左移操作符
移位规则:左边抛弃,右边补0
1.2 >>右移操作符(算数右移)
移位规则:右边抛弃,左边补符号位
/*
现在的编译器都是算数右移,很少逻辑右移(右边抛弃,左边补零)的,左移操作符没什么说的规则都一样
*/
注意:所有移位操作符的操作数只能是整数 !
2. 位操作符 & l ^ ~
2.1 按位与 &
规则: 有0为0,同1为1
0&任何数都为0
一个数按位与自己等于它本身
2.2 按位或 I
规则:有1则1,同0则0
1I任何数都得它本身
2.3 按位异或 ^
规则:相同为0,相异为1
0^任何数都得它本身
一个数异或它自己等于0
2.4 按位取反 ~
规则:所有位取反
3 实战
看都看到这了来点变态面试题折磨一下你
3.1不能创建临时变量(第三个变量),实现两个整形的交换
解法一
这种方法是最简单最好想的,但是如果数据很大没超出整形的范围该怎么办呢?这种方式就不适应
解法二
^运算时就不存在数据过大而超出的情况
3.2求一个整形数据在内存中二进制中1的个数
解法1
内存中存的是补码,只能计算正数在内存中的二进制1的个数,负数就算不准确,这个代码只能计算出整形数据原码中二进制中1的个数
解法二
用>>后&1的值来判断,该位是不是1
解法三
n&(n-1) 每次解决一个1