☰
C语言进阶--回顾(03)
2026/10/2 12:58:27 网站建设 项目流程

(第三篇)

目录

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 练习2

3.5.7 练习3

3.5.8模拟权限控制实现


3.4移位操作符

3.4.1左移操作符

(a)左移相当于将二进制数的补码所有数左移一位,在右边补上0,大小=原数*2;

(b)左移不能太多,以免溢出丢失数据;

(c)左移28位

(d)不难发现,如果再左移一位,数据就会溢出,最后得到数据大小为原数据*2-存储的最大数;

(e)unsigned 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的时候才为1;

3.5.2 |

(a)|和&相反,有1为1,同0为0;

3.5.2 ~

(a)按位取反,所有二进制位上的数0变1,1变0;

3.5.4 ^

(a)相同为0,不同为1;

打印:

3.5.5 练习

(a)我们知道完成两个整数的交换一般要创建第三个变量接收一个变量的值,最后传入,但是有没有方法直接实现两个整数的交换呢?

例如:

(b)虽然代码没什么问题,但是如果存在a,b较大,a+b超过了最大数据,就会发生溢出;

于是就有了:

(c)分析发现,

(1)通过交换律得知,对b相当于赋给它:a^b^b,即a^0=a;

(2)同理,给a:a^b^a=b^0=b,完成交换;

3.5.6 练习2

(a)方法1是有点像使用右移操作符,每次右移一个字节右移后如果最右边的一位为1,使计数++;移动32位则判定完32位的1的数量,但是像右移操作符一样遇到负数失效;

(b)方法2使用1的补码持续左移,由于同1才为1,而1只有1位比特位的数字为1,对应的,如果跟它判定的数字这一位也为1,那数字正好>0;反之,则是返回0;返回正数时使计数+1;同时每次使1左移一位,达成对整个补码的扫描,但是循环32次效率底;

(c)方法三

原理如下:

(d)通过n与n-1特殊的关系能排查有多少1;

(e)同上,n&(n-1)得到最后一位是1或0,最后为0且不为0的数为2的幂次方数;

3.5.7 练习3

代码如下:

(a)先将1移动到指定位置,使用|就可以保留原数的其他位数,对指定位置进行操作:若本身为1,则还是为1;为0,改为1;

(b)改0同理;

3.5.8模拟权限控制实现

(a)过程不过多赘述,基本跟之前的雷同,仅需知道能实现这个功能即可;

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询