bit shift
位运算在原来学数逻时候是第一次系统接触,包括后面计组等课都陆续加以巩固,但是
实际cpp的时候却很少用,其实乘2 除2的操作到了底层都是位运算,左移右移可以极大的提高效率,据某度某科说提高60%
于是稍微回顾一下,用的数是int类型,4B,32bit,补码编码,-2^31-2^31-1, 据说某歌面试极其喜欢位运算。
正数右移1位,高位补0,等于整数/2操作,奇数丢失精度
负数右移1位,高位补1,等于整数/2操作,奇数丢失精度,但是-1右移等于-1,与-1/2=0结果不一致,好像奇负数都会丢失精度,好像右移和/2 还会差一。。。例如-5/2=-2,-5>>2=-3….
正数左移1位,低位补0,等于整数乘2操作,除符号位最高位为1(01000…000~01111…11111这2^30个数)会上溢出(>=2^30,乘2后>=2^31超出2^31-1的正数上界)导致结果出错
负数左移1位,低位补0,等于整数乘2操作,除去符号位,最高位为0时下溢出(从十进制数来看,-2*30左移乘2到-2^31刚好到负数下界,-(2^30+1)开始下溢,一直到-(2^30+2^30-1)=-(2^31-1) 外加特殊的
-2^31都会下溢。按照补码取反加1,也即10000…0001到101111…1111外加1000…00000这2^30-1+1=2^30个数会下溢,所以总结来看,就是如果负数的话,当数值部分最高位为0) 导致结果出错。
然后之前还有总结神奇的异或操作,求数组中唯一不出现偶数次的数,与可以判断更快的判断奇偶性(与0X0001与)等等。