0
点赞
收藏
分享

微信扫一扫

(第16章)LinuxC本质中运算符详解


文章目录

  • ​​一、位运算:重点​​
  • ​​学完本节之后你应该能自己写出UTF-8的编码和解码程序​​
  • ​​1.按位与、或、异或、取反运算​​
  • ​​二、移位运算​​
  • ​​1.移位的要求:移动的位数必须小于左操作数的总位数​​
  • ​​2.对于无符号数,二进制数左移一位相当于十进制数乘以2​​
  • ​​3.对于无符号数,二进制数右移一位相当于十进制数乘除2​​
  • ​​4.对于有符号数的右移而言​​
  • ​​5.建议只对无符号数做位运算​​
  • ​​三、移位操作与掩码​​
  • ​​1.取出8~15位​​
  • ​​2.将8~15位清0​​
  • ​​3.将8~15位置1​​
  • ​​4.习题​​
  • ​​四、异或运算​​
  • ​​(1)异或运算的速度比movl指令的速度快​​
  • ​​(2)和0做异或保持原值不变,和1做异或得到原值的相反值​​
  • ​​(4)利用位运算可以这样做交换​​
  • ​​五、条件运算符​​
  • ​​六、sizeof运算符与typedef类型声明​​
  • ​​1.sizeof 表达式​​
  • ​​2.sizeof (类型名):求一个数组的长度​​
  • ​​3.用 typedef 做一个类型声明​​
  • ​​4.typedef 这个关键字用于给某种类型起个新名字​​
  • ​​七、Side Effect与Sequence Point​​
  • ​​1.详细解释各种Sequence Point​​
  • ​​2.写表达式应遵循的原则​​
  • ​​八、运算符总结​​

一、位运算:重点

学完本节之后你应该能自己写出UTF-8的编码和解码程序

1.按位与、或、异或、取反运算

(1)下面用二进制的形式举几个例子

(第16章)LinuxC本质中运算符详解_运算符


(第16章)LinuxC本质中运算符详解_运算符_02


(2)其它eg

(第16章)LinuxC本质中运算符详解_无符号数_03

二、移位运算

1.移位的要求:移动的位数必须小于左操作数的总位数

2.对于无符号数,二进制数左移一位相当于十进制数乘以2

(第16章)LinuxC本质中运算符详解_无符号数_04


(第16章)LinuxC本质中运算符详解_位运算_05

3.对于无符号数,二进制数右移一位相当于十进制数乘除2

(第16章)LinuxC本质中运算符详解_位运算_06


(第16章)LinuxC本质中运算符详解_运算符_07

4.对于有符号数的右移而言

(第16章)LinuxC本质中运算符详解_运算符_08

5.建议只对无符号数做位运算

(第16章)LinuxC本质中运算符详解_无符号数_09

三、移位操作与掩码

1.取出8~15位

比如掩码0x0000ff00表示对一个32位整数的8~15位进行操作,举例如下。

(第16章)LinuxC本质中运算符详解_位运算_10

2.将8~15位清0

(第16章)LinuxC本质中运算符详解_无符号数_11

3.将8~15位置1

(第16章)LinuxC本质中运算符详解_运算符_12

4.习题

(第16章)LinuxC本质中运算符详解_位运算_13

int count(usigned int x)
{
int sum=0;
int i=0;
for (;i<32;i++)
{
if (((x>>i)&0x01)==0x01)
sum++;
}
return sum;
}

四、异或运算

(1)异或运算的速度比movl指令的速度快

(第16章)LinuxC本质中运算符详解_位运算_14

(2)和0做异或保持原值不变,和1做异或得到原值的相反值

可以利用这个特性配合掩码实现某些位的翻转,例如:

(第16章)LinuxC本质中运算符详解_位运算_15


(3)奇偶校验

(第16章)LinuxC本质中运算符详解_无符号数_16

(4)利用位运算可以这样做交换

(第16章)LinuxC本质中运算符详解_无符号数_17


(第16章)LinuxC本质中运算符详解_无符号数_18

五、条件运算符

(第16章)LinuxC本质中运算符详解_运算符_19


eg:

(第16章)LinuxC本质中运算符详解_位运算_20

六、sizeof运算符与typedef类型声明

1.sizeof 表达式

sizeof 表达式中的子表达式并不求值,而只是根据类型转换规则求得子表达式的类型,然后把这种类型所占的字节数作为整个表达式的值。

2.sizeof (类型名):求一个数组的长度

sizeof(类型名) 的括号则是必须写的,整个表达式的值也是这种类型所占的字节数。

(第16章)LinuxC本质中运算符详解_无符号数_21

3.用 typedef 做一个类型声明

(第16章)LinuxC本质中运算符详解_运算符_22

4.typedef 这个关键字用于给某种类型起个新名字

(第16章)LinuxC本质中运算符详解_无符号数_23

七、Side Effect与Sequence Point

1.详细解释各种Sequence Point

(第16章)LinuxC本质中运算符详解_位运算_24


(第16章)LinuxC本质中运算符详解_位运算_25


(第16章)LinuxC本质中运算符详解_无符号数_26


eg:

(第16章)LinuxC本质中运算符详解_运算符_27


why??

(第16章)LinuxC本质中运算符详解_位运算_28

2.写表达式应遵循的原则

(第16章)LinuxC本质中运算符详解_运算符_29

八、运算符总结

(1)

(第16章)LinuxC本质中运算符详解_运算符_30


(2)左结合和右结合这两个概念只对双目运算符有意义,对于前缀、后缀和三目运算符我单独做了说明。

(第16章)LinuxC本质中运算符详解_运算符_31


(第16章)LinuxC本质中运算符详解_无符号数_32


(第16章)LinuxC本质中运算符详解_无符号数_33


举报

相关推荐

0 条评论