)
第三篇目录3.4移位操作符3.4.1左移操作符3.4.2右移操作符3.5 位操作符3.5.1 3.5.2 |3.5.2 ~3.5.4 ^3.5.5 练习3.5.6 练习23.5.7 练习33.5.8模拟权限控制实现3.4移位操作符3.4.1左移操作符a左移相当于将二进制数的补码所有数左移一位在右边补上0大小原数*2b左移不能太多以免溢出丢失数据c左移28位d不难发现如果再左移一位数据就会溢出最后得到数据大小为原数据*2-存储的最大数eunsigned int一共32字节也就是2的32次方将原数*2减去2的32次方得到左移后的数3.4.2右移操作符代码实例a要注意的是右移操作符分为逻辑右移和算数右移对于不同类型的数据需要不同的操作a对于左移和右移最好使用无符号类型有符号类型可能因为操作而发生错误b负数左右移都是无定义的操作3.5 位操作符a这四种位操作符的效果必须记住尽管确实难记b操作符操作的对象都是补码c操作以后得到的都是一个二进制数3.5.1 a对两个数的补码同位置上有0为0都是1的时候才为13.5.2 |a|和相反有1为1同0为03.5.2 ~a按位取反所有二进制位上的数0变11变03.5.4 ^a相同为0不同为1打印3.5.5 练习a我们知道完成两个整数的交换一般要创建第三个变量接收一个变量的值最后传入但是有没有方法直接实现两个整数的交换呢例如b虽然代码没什么问题但是如果存在ab较大ab超过了最大数据就会发生溢出于是就有了c分析发现1通过交换律得知对b相当于赋给它a^b^b即a^0a;(2)同理给aa^b^ab^0b,完成交换3.5.6 练习2a方法1是有点像使用右移操作符每次右移一个字节右移后如果最右边的一位为1使计数移动32位则判定完32位的1的数量但是像右移操作符一样遇到负数失效b方法2使用1的补码持续左移由于同1才为1而1只有1位比特位的数字为1对应的如果跟它判定的数字这一位也为1那数字正好0;反之则是返回0返回正数时使计数1同时每次使1左移一位达成对整个补码的扫描但是循环32次效率底c方法三原理如下d通过n与n-1特殊的关系能排查有多少1e同上n(n-1)得到最后一位是1或0最后为0且不为0的数为2的幂次方数3.5.7 练习3代码如下a先将1移动到指定位置使用|就可以保留原数的其他位数对指定位置进行操作若本身为1则还是为1为0改为1b改0同理3.5.8模拟权限控制实现a过程不过多赘述基本跟之前的雷同仅需知道能实现这个功能即可