共有四种逻辑运算:与,或,非,异或。
移位运算:左移,右移实现乘法。注意一般左移时没有疑问,后面补0。右移时,不同的编译器有不同的解释,一般的是如果即左最高位为0,则右移时还用0补齐,否则是1的话(unsigned或负数),用1补齐。
加减乘除运算,严格意义上来说,十进制的加减乘除就是位运算加减乘除得来的。属于注意加法在最高位会溢出,即最高位1 + 1 = 0,没有进位。还有减法等。(对这个不熟,以后再看)。
一些常用的技巧(利用1, 0 的与,或设置位,因为是逻辑运算,所以不影响其他位。(不要死记硬背,否则记错的话,发现不了问题,理解就可以呢):
a ^ (~a) = 1s (1s表示一串1,负的最小数)。 将最右边的n 位 清零,清零即与0 与,a & ( ~0 << n).
获取某一位:两种方法,将其右移n位,然后与1 与。或者将1 左移n 位,然后与这个数与。 置位,即将此位置位0,这个数与111110111111(随便写的,将1左移,然后取反)且,则其他位不变,这个位变为0。将此位置位1,则与000000100000000或。还有一些其他做法。
找出一个十进制数的二进制位串中,所有的1 。此题直观的方法有两种,循环将1左移(0001000),然后与,得到的值不为0,则此位为1。第二种方法,循环右移这个数,然后与1 与。这种方法如果不知道要循环多少次,而只是判断移过后,得到的这个数不为0,即 while(n),则如果碰到最高位为1的数时,会出现死循环。
还有一种方法,常用,在其他算法中也常用,先将这个数减1,然后与自己与,则自己的最右边一个数变为0。不管对什么都适用。