位赋值运算符
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第12章 位运算
位运算 位赋值运算符 位段 应用举例
12.1 位运算
1.位运算和指针一样,都是C语言的重要特色。 .位运算和指针一样,都是 语言的重要特色 语言的重要特色。 2.位运算的概念: .位运算的概念: 的概念 所谓位运算,是指进行二进制位的运算。 所谓位运算,是指进行二进制位的运算。 例如:将一个存储单元中的各二进制位左移或右移1位 例如:将一个存储单元中的各二进制位左移或右移 位, 两个数按位相加等。 两个数按位相加等。 3. 位运算有: 位运算有:
12.1 位运算
12.1.1 位逻辑运算符 1. 按位与运算符 . 按位与运算符& 运算规则:如果参加运算的两个运算量的相应位都是1, 运算规则:如果参加运算的两个运算量的相应位都是 , 则该位的结果值为1,否则为0。 则该位的结果值为 ,否则为 。 例如: 例如: a:01111010 b:10011000 ────── &:00011000 即a&b=0x18
a: a<<2: 00100001 10000100
12.1 位运算
12.1.2 移位运算符 1.右移运算符>> .右移运算符 运算规则: 运算规则:对>>左边的运算量的每一位全部右移右边运 左边的运算量的每一位全部右移右边运 算量表示的位数,低位被移出去舍弃,空出的高位补0还是 算量表示的位数,低位被移出去舍弃,空出的高位补 还是 补1,分两种情况: ,分两种情况: (1)对无符号数进行右移时,空出的高位补 。这种右移称 )对无符号数进行右移时,空出的高位补0。 为逻辑右移。 为逻辑右移。 (2)对带符号数进行右移时,空出的高位以符号位填补。 )对带符号数进行右移时,空出的高位以符号位填补。 即正数补0,负数补1。这种右移称为算术右移。 即正数补 ,负数补 。这种右移称为算术右移。
百度文库
运行结果: 运行结果:
input num:12345↙ ↙ binary of 3039 is: 0011000000111001
12.4 应用举例
循环移位的实现。 例12-2 循环移位的实现。
左移 :
主程序: 主程序:
main( ) { unsigned rol(unsigned x,int n); unsigned ror(unsigned x, int n); unsigned a; int n; printf("input a,n:"); scanf("%x,%d",&a,&n); printf("a=%x rotleft n=%d bit is %x\n",a,n,rol(a,n)); printf("a=%x rotright n=%d bit is %x\n",a,n,ror(a,n)); }
12.1 位运算
12.1.1 位逻辑运算符 3.按位异或运算符∧ .按位异或运算符∧ 运算规则:如果两个运算量的相应位不同, 运算规则:如果两个运算量的相应位不同,则该位的结 果值为1,否则为0。 果值为 ,否则为 。 例如: 例如: a:01111010 b:10011000 ───── ∧:11100010 即a∧b=0xe2 ∧
12.3 位段
C语言允许在一个结构体中以位为 语言允许在一个结构体中以位为 单位来指定其成员所占的内存长度, 单位来指定其成员所占的内存长度, 这种以位为单位的成员称为“位段” 这种以位为单位的成员称为“位段” 位域” 位段” 位域” 或“位域”。“位段”或“位域”是 一种特殊的结构体成员。 一种特殊的结构体成员。 定义的一般格式为: 定义的一般格式为: struct结构体名 结构体名 { 成员1: 长度; 类型 成员 长度 成员2: 长度; 类型 成员 长度 … 成员n: 长度; 类型 成员 长度 }; 其中,冒号前的成员为位段, 其中,冒号前的成员为位段,冒号后 的长度表示存储位段需要占用字节的 位数。 位数。 例如: 例如: struct device { unsigned a:1; unsigned b:2; unsigned c:4; int x; float y; }data; 结构体变量data包含 个成员,它们分 包含5个成员 结构体变量 包含 个成员, 别是a, , , , 。 别是 ,b,c,x,y。 其中, 、 、 为位段 分别占用1 为位段, 其中,a、b、c为位段,分别占用 位、2位、4位,即a、b、c共占用 位。 位 位 、 、 共占用7位 共占用 这样, 这样,用一个字节就可以存储这三个 位段。 、 为基本类型的成员 为基本类型的成员, 位段。x、y为基本类型的成员,分别 需要2个 个字节存储 因此, 个字节存储。 需要 个、4个字节存储。因此,结构 体变量data需要占用 个字节的内存单 需要占用7个字节的内存单 体变量 需要占用 元。
2个字节 x 16
4个字节 y 32
12.4 应用举例
输出一个整数的二进制形式。 例12-1 输出一个整数的二进制形式。 程序: 程序:
main( ) { int num,bit,i; unsigned test=0x8000; printf("input mum:"); scanf("%d",&num); printf("binary of %x is: ",num); for(i=1;i<=16;i++) { bit=((num&test)==0)?0:1; printf("%d",bit); test>>=1; } }
12.1 位运算
12.1.2 移位运算符 1. 左移运算符 . 左移运算符<< 运算规则: 运算规则:对<<左边的运算量的每一位全部左移右边运 左边的运算量的每一位全部左移右边运 算量表示的位数。 算量表示的位数。 例如: 表示将a的各位依次向左移 的最高2位移 例如:a<<2表示将 的各位依次向左移 位,a的最高 位移 表示将 的各位依次向左移2位 的最高 出去舍弃,空出的低2位以 填补。 位以0填补 出去舍弃,空出的低 位以 填补。
12.1 位运算
12.1.1 位逻辑运算符 位逻辑运算规则 a 0 0 1 1 b 0 1 0 1 a&b 0 0 0 1 a|b 0 1 1 1 a∧b ∧ 0 1 1 0 ~a 1 1 0 0 ~b 1 0 1 0
12.1 位运算
12.1.1 位逻辑运算符 5.位逻辑运算符的用途 . (1)判断一个数据的某位是否为 。 )判断一个数据的某位是否为1。 (2)屏蔽掉一个数据中的某些位。 )屏蔽掉一个数据中的某些位。 (3)清零。 )清零。 (4)保留若干位。 )保留若干位。 (5)把一个数据的某位置为 。 )把一个数据的某位置为1。 变为0, 变为 变为1。 (6)把一个数据的某位翻转,即1变为 ,0变为 。 )把一个数据的某位翻转, 变为
12.1 位运算
12.1.1 位逻辑运算符 2.按位或运算符| .按位或运算符 运算规则:如果两个运算量的相应位都是0, 运算规则:如果两个运算量的相应位都是 ,则该位的结 果值为0,否则为1。 果值为 ,否则为 。 例如: 例如: a:01111010 b:10011000 ───── |: 11111010 即a|b=0xfa
12.3 位段
例如: 例如: struct device { unsigned a:1; unsigned b:2; unsigned c:4; int x; float y; }data;
1个字节 c 1 4 b 2 a 1
结构体变量data包含 个成员,它们分别是 ,b,c, 包含5个成员 它们分别是a, , , 结构体变量 包含 个成员, x,y。 , 。 其中, 、 、 为位段 分别占用1位 为位段, 其中,a、b、c为位段,分别占用 位、2位、4位, 位 位 共占用7位 这样, 即a、b、c共占用 位。这样,用一个字节就可以存储 、 、 共占用 这三个位段。 、 为基本类型的成员 分别需要2个 为基本类型的成员, 这三个位段。x、y为基本类型的成员,分别需要 个、 4个字节存储。因此,结构体变量 个字节存储。 需要占用7个字 个字节存储 因此,结构体变量data需要占用 个字 需要占用 节的内存单元。 节的内存单元。
位运算符 & | ∧ ~ << >> 含义 按位与 按位或 按位异或 按位取反 左移 右移 举例 a&b a|b a∧b ∧ ~a a<<1 b>>2
说明: 说明: 只能是整型或字符型数据, (1)位运算量 ,b只能是整型或字符型数据,不能是实型数据。 )位运算量a, 只能是整型或字符型数据 不能是实型数据。 为单目运算符外, (2)位运算符中除按位取反运算符 为单目运算符外,其它均为双目运算符。 )位运算符中除按位取反运算符~为单目运算符外 其它均为双目运算符。
12.2 位赋值运算符
位赋值运算符是位运算符与赋值运算符的结合。 位赋值运算符是位运算符与赋值运算符的结合。 位赋值运算符 位赋值运算符 &= |= ∧= <<= >>= 含义 位与赋值 位或赋值 位异或赋值 左移赋值 右移赋值 举例 a&=b a|=b a∧=b ∧ a<<=b a>>=b 等同于 a=a&b a=a|b a=a∧b ∧ a=a<<b a=a>>b
小
位运算
结
位赋值运算符 位段 应用举例
作业和上机实验
12.1 位运算
12.1.1 位逻辑运算符 4.按位取反运算符~ .按位取反运算符 运算规则:对一个运算量的每一位都取反,即将1变为 变为0, 运算规则:对一个运算量的每一位都取反,即将 变为 , 0变为 。 变为1。 变为 例如: 例如: a: 01111010 ───── ~a:10000101 即~a=0x85
unsigned rol(unsigned x,int n) { unsigned y; y=(x<<n)|(x>>(16-n)); return(y); }
右移 :
unsigned ror(unsigned x, int n) { unsigned y; y=(x>>n)|(x<<(16-n)); return(y); }
位运算 位赋值运算符 位段 应用举例
12.1 位运算
1.位运算和指针一样,都是C语言的重要特色。 .位运算和指针一样,都是 语言的重要特色 语言的重要特色。 2.位运算的概念: .位运算的概念: 的概念 所谓位运算,是指进行二进制位的运算。 所谓位运算,是指进行二进制位的运算。 例如:将一个存储单元中的各二进制位左移或右移1位 例如:将一个存储单元中的各二进制位左移或右移 位, 两个数按位相加等。 两个数按位相加等。 3. 位运算有: 位运算有:
12.1 位运算
12.1.1 位逻辑运算符 1. 按位与运算符 . 按位与运算符& 运算规则:如果参加运算的两个运算量的相应位都是1, 运算规则:如果参加运算的两个运算量的相应位都是 , 则该位的结果值为1,否则为0。 则该位的结果值为 ,否则为 。 例如: 例如: a:01111010 b:10011000 ────── &:00011000 即a&b=0x18
a: a<<2: 00100001 10000100
12.1 位运算
12.1.2 移位运算符 1.右移运算符>> .右移运算符 运算规则: 运算规则:对>>左边的运算量的每一位全部右移右边运 左边的运算量的每一位全部右移右边运 算量表示的位数,低位被移出去舍弃,空出的高位补0还是 算量表示的位数,低位被移出去舍弃,空出的高位补 还是 补1,分两种情况: ,分两种情况: (1)对无符号数进行右移时,空出的高位补 。这种右移称 )对无符号数进行右移时,空出的高位补0。 为逻辑右移。 为逻辑右移。 (2)对带符号数进行右移时,空出的高位以符号位填补。 )对带符号数进行右移时,空出的高位以符号位填补。 即正数补0,负数补1。这种右移称为算术右移。 即正数补 ,负数补 。这种右移称为算术右移。
百度文库
运行结果: 运行结果:
input num:12345↙ ↙ binary of 3039 is: 0011000000111001
12.4 应用举例
循环移位的实现。 例12-2 循环移位的实现。
左移 :
主程序: 主程序:
main( ) { unsigned rol(unsigned x,int n); unsigned ror(unsigned x, int n); unsigned a; int n; printf("input a,n:"); scanf("%x,%d",&a,&n); printf("a=%x rotleft n=%d bit is %x\n",a,n,rol(a,n)); printf("a=%x rotright n=%d bit is %x\n",a,n,ror(a,n)); }
12.1 位运算
12.1.1 位逻辑运算符 3.按位异或运算符∧ .按位异或运算符∧ 运算规则:如果两个运算量的相应位不同, 运算规则:如果两个运算量的相应位不同,则该位的结 果值为1,否则为0。 果值为 ,否则为 。 例如: 例如: a:01111010 b:10011000 ───── ∧:11100010 即a∧b=0xe2 ∧
12.3 位段
C语言允许在一个结构体中以位为 语言允许在一个结构体中以位为 单位来指定其成员所占的内存长度, 单位来指定其成员所占的内存长度, 这种以位为单位的成员称为“位段” 这种以位为单位的成员称为“位段” 位域” 位段” 位域” 或“位域”。“位段”或“位域”是 一种特殊的结构体成员。 一种特殊的结构体成员。 定义的一般格式为: 定义的一般格式为: struct结构体名 结构体名 { 成员1: 长度; 类型 成员 长度 成员2: 长度; 类型 成员 长度 … 成员n: 长度; 类型 成员 长度 }; 其中,冒号前的成员为位段, 其中,冒号前的成员为位段,冒号后 的长度表示存储位段需要占用字节的 位数。 位数。 例如: 例如: struct device { unsigned a:1; unsigned b:2; unsigned c:4; int x; float y; }data; 结构体变量data包含 个成员,它们分 包含5个成员 结构体变量 包含 个成员, 别是a, , , , 。 别是 ,b,c,x,y。 其中, 、 、 为位段 分别占用1 为位段, 其中,a、b、c为位段,分别占用 位、2位、4位,即a、b、c共占用 位。 位 位 、 、 共占用7位 共占用 这样, 这样,用一个字节就可以存储这三个 位段。 、 为基本类型的成员 为基本类型的成员, 位段。x、y为基本类型的成员,分别 需要2个 个字节存储 因此, 个字节存储。 需要 个、4个字节存储。因此,结构 体变量data需要占用 个字节的内存单 需要占用7个字节的内存单 体变量 需要占用 元。
2个字节 x 16
4个字节 y 32
12.4 应用举例
输出一个整数的二进制形式。 例12-1 输出一个整数的二进制形式。 程序: 程序:
main( ) { int num,bit,i; unsigned test=0x8000; printf("input mum:"); scanf("%d",&num); printf("binary of %x is: ",num); for(i=1;i<=16;i++) { bit=((num&test)==0)?0:1; printf("%d",bit); test>>=1; } }
12.1 位运算
12.1.2 移位运算符 1. 左移运算符 . 左移运算符<< 运算规则: 运算规则:对<<左边的运算量的每一位全部左移右边运 左边的运算量的每一位全部左移右边运 算量表示的位数。 算量表示的位数。 例如: 表示将a的各位依次向左移 的最高2位移 例如:a<<2表示将 的各位依次向左移 位,a的最高 位移 表示将 的各位依次向左移2位 的最高 出去舍弃,空出的低2位以 填补。 位以0填补 出去舍弃,空出的低 位以 填补。
12.1 位运算
12.1.1 位逻辑运算符 位逻辑运算规则 a 0 0 1 1 b 0 1 0 1 a&b 0 0 0 1 a|b 0 1 1 1 a∧b ∧ 0 1 1 0 ~a 1 1 0 0 ~b 1 0 1 0
12.1 位运算
12.1.1 位逻辑运算符 5.位逻辑运算符的用途 . (1)判断一个数据的某位是否为 。 )判断一个数据的某位是否为1。 (2)屏蔽掉一个数据中的某些位。 )屏蔽掉一个数据中的某些位。 (3)清零。 )清零。 (4)保留若干位。 )保留若干位。 (5)把一个数据的某位置为 。 )把一个数据的某位置为1。 变为0, 变为 变为1。 (6)把一个数据的某位翻转,即1变为 ,0变为 。 )把一个数据的某位翻转, 变为
12.1 位运算
12.1.1 位逻辑运算符 2.按位或运算符| .按位或运算符 运算规则:如果两个运算量的相应位都是0, 运算规则:如果两个运算量的相应位都是 ,则该位的结 果值为0,否则为1。 果值为 ,否则为 。 例如: 例如: a:01111010 b:10011000 ───── |: 11111010 即a|b=0xfa
12.3 位段
例如: 例如: struct device { unsigned a:1; unsigned b:2; unsigned c:4; int x; float y; }data;
1个字节 c 1 4 b 2 a 1
结构体变量data包含 个成员,它们分别是 ,b,c, 包含5个成员 它们分别是a, , , 结构体变量 包含 个成员, x,y。 , 。 其中, 、 、 为位段 分别占用1位 为位段, 其中,a、b、c为位段,分别占用 位、2位、4位, 位 位 共占用7位 这样, 即a、b、c共占用 位。这样,用一个字节就可以存储 、 、 共占用 这三个位段。 、 为基本类型的成员 分别需要2个 为基本类型的成员, 这三个位段。x、y为基本类型的成员,分别需要 个、 4个字节存储。因此,结构体变量 个字节存储。 需要占用7个字 个字节存储 因此,结构体变量data需要占用 个字 需要占用 节的内存单元。 节的内存单元。
位运算符 & | ∧ ~ << >> 含义 按位与 按位或 按位异或 按位取反 左移 右移 举例 a&b a|b a∧b ∧ ~a a<<1 b>>2
说明: 说明: 只能是整型或字符型数据, (1)位运算量 ,b只能是整型或字符型数据,不能是实型数据。 )位运算量a, 只能是整型或字符型数据 不能是实型数据。 为单目运算符外, (2)位运算符中除按位取反运算符 为单目运算符外,其它均为双目运算符。 )位运算符中除按位取反运算符~为单目运算符外 其它均为双目运算符。
12.2 位赋值运算符
位赋值运算符是位运算符与赋值运算符的结合。 位赋值运算符是位运算符与赋值运算符的结合。 位赋值运算符 位赋值运算符 &= |= ∧= <<= >>= 含义 位与赋值 位或赋值 位异或赋值 左移赋值 右移赋值 举例 a&=b a|=b a∧=b ∧ a<<=b a>>=b 等同于 a=a&b a=a|b a=a∧b ∧ a=a<<b a=a>>b
小
位运算
结
位赋值运算符 位段 应用举例
作业和上机实验
12.1 位运算
12.1.1 位逻辑运算符 4.按位取反运算符~ .按位取反运算符 运算规则:对一个运算量的每一位都取反,即将1变为 变为0, 运算规则:对一个运算量的每一位都取反,即将 变为 , 0变为 。 变为1。 变为 例如: 例如: a: 01111010 ───── ~a:10000101 即~a=0x85
unsigned rol(unsigned x,int n) { unsigned y; y=(x<<n)|(x>>(16-n)); return(y); }
右移 :
unsigned ror(unsigned x, int n) { unsigned y; y=(x>>n)|(x<<(16-n)); return(y); }