随风而动,随遇而安......
C语言位运算-学习二十六
02/21
本文最后更新于
2022年08月13日,已超过
783天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
运算符
使用说明:
- 1.位运算符中,除按位取反运算符“~”外,其他均为二目(元)运算符,即运算符两侧各有一个操作对象;
- 2.位运算的运算对象的数据类型只能是整型或字符型;
- 3.位运算可以与赋值运算符结合,组成位复合赋值运算符符:
<<=
、=>>
、&=
、^=
、|=
按位取反运算
语法格式:
~ 表达式
- 按位取反运算符(~)的运算规则:
对参与运算的表达式的值按位进行“求反”运算。即将表达式值各二进制位上的1变为0,0变为1。 - 按位取反(~)为单目运算符,其优先级别与其他单目运算符相同,并且同级时自右向左结合。
例如:
int a=1;
~a
即0
0
0
0
0
0
0
1
-----------------------------------1
1
1
1
1
1
1
0
,因此~a
的值得 -2 。
- 例子
#include <stdio.h>
void main(){
short int a = 1, b;
b = ~a;
printf("a= %d\nb= %d\n",a, b);
}
按位与运算
语法格式:
表达式1 & 表达式2
- 按位与运算符(&)的运算规则:
将参加运算的两个表达式值按对应的进制位分别进行“与”运算。两个对应的二进制位都为1时,该位的结果为1;否则为0。 例如:
3 & 5
即0000 0011
0000 0101
-----------------0000 0001
,因此3&5
的值得 1。
- 注意:负数按补码形式参加按位与运算。
- 使用“按位与(&)”运算符时,要注意与“逻辑与(&&)”运算符的区别。
- 例子
#include <stdio.h>
void main(){
short int a = 3, b=5,c;
c= a & b;
printf("c= %d\n",c);
}
按位或运算
语法格式:
表达式1 | 表达式2
- 按位或运算符(|)的运算规则:
将参与运算的两个表达式值按对应的二进位分别进行“或”运算。当两个对应的二进制位有1位是1时,该位的结果为1;否则为0。 例如:
3 | 5
即0000 0011
0000 0101
-----------------0000 0111
,因此3|5
的值得 7。
- 注意:负数按补码形式参加按位与运算。
- 使用“按位或(|)”运算符时,要注意与“逻辑或(||)”运算符的区别。
- 例子
#include <stdio.h>
void main(){
short int a = 3, b=5,c;
c= a | b;
printf("c= %d\n",c);
}
按位异或运算
语法格式:
表达式1 ^ 表达式2
- 按位异或运算符(^)的运算规则:
将参与运算的两个表达式值按对应的二进制位分别进行“异或”运算。当两个对应的二进制位值不相同为1;否则为0。
例如:
3 ^ 5
即0000 0011
0000 0101
-----------------0000 0110
,因此3^5
的值得 6。
- 例子
#include <stdio.h>
void main(){
short int a = 3, b=5,c;
c= a ^ b;
printf("c= %d\n",c);
}
左移
语法格式:
表达式1 << 表达式2
- 表达式1是被移动的运算对象
- 表达式2是移动的位数
- 左移运算符(<<)的运算规则:
将表达式1的值的二进制位每位左移表达式2的值的位数。二进制位向左移动时,移出的高位直接丢弃,低位出现的空位补0。 例如:
int a=1;
a << 2
即a=0000 0001
-----------------a=0000 0100
因此a << 2
的值得 4。
-例子
#include <stdio.h>
void main() {
int a = 1,b;
b = a << 2;
printf("b= %d\n", b);
}
右移
语法格式:
表达式1 >> 表达式2
- 表达式1是被移动的运算对象
- 表达式2是移动的位数
- 右移后左边的空位上补0还是补1与表达式1的类型以及所使用的机器和编译环境有关
- 右移运算符(>>)的运算规则:
将表达式1的值的二进制位每位右移表达式2的值的位数。二进制位向右移动时,正数左补0,负数一般左补1,右边丢弃(即不改变原来的数值符号)。 - 如果是无符号类型,二进制位向右移动时左补0,右边丢弃。
- 右移n位相当于除以2n
- 注意:原来符号是1(负数),左边空位补0还是1,取决于所使用的计算机系统,有的系统补0,有的系统补1。
补0的称为“逻辑右移”,也称为简单右移;补1则称为“算术右移”
例如:
int a=4;
a >> 2
即a=0000 0100
-----------------a=0000 0001
因此a >> 2
的值得 1。
- 例如:
int a=-4;
a >> 2
即
-例子
#include <stdio.h>
void main() {
int a = 4,b;
b = a >> 2;
printf("b= %d\n", b);
}
位赋值运算
位运算可以和赋值运算结合成位运算赋值运算符。
&=
例:a&=b
相当于a=a&b
|=
例:a|=b
相当于a=a|b
>>=
例:a>>=b
相当于a=a>>b
<<=
例:a<<=b
相当于a=a<<b
^=
例:a^=b
相当于a=a^b