C语言中的位运算
来源:互联网 发布:sql rownum用法 编辑:程序博客网 时间:2024/04/28 13:00
一、位逻辑运算:
1.“&”:按位与。参与运算的量,如果相对应的两位(二进制表示)都为1,则该位的结果值为1,否则为0,即:
0&0==0
如:
int a=10,b=6,c= a & b;
即:
a:00000000 00000000 00000000 00001010
b:00000000 00000000 00000000 00000110
c:00000000 00000000 00000000 00000010
所以,c=2。.
2.“|”:按位或。参与运算的量,如果相对应的两位(二进制表示)都为0,则该位的结果值为0,否则为1,即:
0|0==0
如:
int a=10,b=6,c= a | b;
即:
a:00000000 00000000 00000000 00001010
b:00000000 00000000 00000000 00000110
c:00000000 00000000 00000000 00001110
所以,c=14。.
3.“^”:按位异或。参与运算的量,如果相对应的两位(二进制表示)相异,则该位的结果为1,否则为0,即:
0∧0==0
如:
int a=10,b=6,c= a ^ b;
即:
a:00000000 00000000 00000000 00001010
b:00000000 00000000 00000000 00000110
c:00000000 00000000 00000000 00001100
所以,c=12。.
4.“~”:按位取反(单目运算符)。将参与运算量的相对应位(二进制表示)的值取反,即1变0,0变1。
如:
int a=10,c= ~a;
即:
a:00000000 00000000 00000000 00001010
取反:11111111 11111111 11111111 11110101(该数为负数,此二进制为其补码,应求其原码形式)
原码:10000000 00000000 00000000 00001011(符号位不变,补码的反码再加1)
即-11。
所以,c=-11。.
二、移位运算:
1.“<<”:按位左移。将一个运算量的各位(二进制表示)依次左移若干位,低位补0,高位舍弃不要。注意:位移操作的右操作数必须小于左操作数的位长度,否则结果未定义。
如:
int a=10,c= a<<2;
即:
a:00000000 00000000 00000000 00001010
c:00000000 00000000 00000000 00101000
所以,c=40。
2.“>>”:按位右移。将一个运算量的各位(二进制表示)依次右移若干位,低位被移出,高位对无符号数补0,对有符号数要按最高符号位自身填补(即右移后符号不变)。注意:位移操作的右操作数必须小于左操作数的位长度,否则结果未定义。
如:
int a=-10,c= a>>2;
即:
a:00000000 00000000 00000000 00001010
a的补码:11111111 11111111 11111111 11110110
c的补码:11111111 11111111 11111111 11111101
c的原码:10000000 00000000 00000000 00000011
所以,c=-3。
3.移位运算的算数规律:在一定的取值范围内(高位不能移出二进制数的有效数字1),将一个整数(无论是正数还是负数)左移1位相当于乘以2;右移运算没有取值范围的限定,但有正负数之别。对于正数,右移1位相当于除以2,小数部分截掉;对于负数,右移1位相当于除以2;小数部分四舍五入。由于计算机做移位比做乘法快得多,编译器可以利用这一点进行优化。
三、位运算的复合赋值运算符:&=(位与赋值)、|=(位或赋值) 、∧= (位异或赋值) 、>>=(按位右移赋值)、<<= (按位左移赋值)。
如a>>=2等价于a=a>>2。
- C语言中的位运算
- C语言中的位运算
- C语言中的位运算
- C语言中的位运算
- C语言中的位运算
- C语言中的位运算
- C语言中的位运算
- C语言中的位运算
- C语言中的位运算
- C语言中的位运算
- C语言中的位运算
- C语言中的位运算
- C 语言中的 位运算
- C语言中的位运算
- C语言中的位运算& ^ |
- C语言中的位运算
- C语言中的位运算
- C语言中的位运算
- 为easyui组件datagrid在加载完之后追加新的数据行
- ...编码在os.listdir
- C++编程问题--注意指针参数的传递
- c# LINQ查询操作符实例操作总结3
- pat 1024
- C语言中的位运算
- 卷积神经网络(CNN)
- maven jar 包配置
- MTK功能机编译相关问题
- ARM Linux 3.x的设备树(Device Tree)
- 体验TinyXML读写XML文件数据
- 编程(C#)实现创建快捷方式文件
- 可变数组的数据添加
- 如何在myeclipse中导入jar包