【CSAPP读书笔记】2.02 C语言中的位运算

按位运算与逻辑运算

按位运算

  C语言中提供 | & ~ ^ 作为位运算符,对变量中的每一个bit进行相关运算。
按位运算

逻辑运算

  C语言提供的逻辑运算运算符为 || && ! ,对应于逻辑命题中的 OR、AND、NOT 运算 。
逻辑运算
  逻辑运算符中,只要第一个元素能确定表达式的结果,就不会再对后一个元素进行运算。但是,& | 等位运算符,仍旧需要计算后一个元素。值得注意的是,很多学校教学时会把 & |&& || 当做逻辑运算的两种不同的实现方式,这是不正确的。& | 是位运算的运算符,而非逻辑运算。

移位

移位分为逻辑移位和算数移位,很多学校教C语言时不会强调两者的区别。

左移

  左移的操作比较好理解,将一个变量向左移动
位后,丢弃最高k位的内容,并在低k位补0。在未溢出的情况下,左移1位相当于将变量乘2。

右移

逻辑右移: 右移后在高位补0。
算数右移: 右移后在高位填充操作数最高位的值,即操作数最高位为0,右移后在高位补0;操作数最高位为1,右移后在高位补1。
移位操作
  事实上,C语言并没有规定对于有符号数应该采取什么类型的右移,事实上几乎所有的编译器都会对有符号数使用算数右移。而对无符号数,右移必须使用逻辑右移。
  这一点可以从移位的运算逻辑进行理解,一般而言,左移操作认为是乘2,右移操作认为是除2(整数除)。
  对于无符号数而言,最高位是有效的数据位,因此若最高位为1,若采用算术右移,则移位后的结果不小于原数值;而采用逻辑右移,在最高位填充0之后,得到的新值便为原值除2后下取整的结果。
  同理,对于有符号数,其最高位表示数值的正负。其中最高位为1表示负数,最高位为0表示正数。 若使用逻辑右移,则负数移位后会在高位补0,此时在使用有符号数表示时得到的新数值会是一个正数,这大大背离了操作的本意。因此,对于有符号数的右移操作应使用算数右移。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值