首页 > 编程知识 正文

c语言算术右移,C语言右移运算

时间:2023-05-05 13:02:24 阅读:241843 作者:3158

      位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。

这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。

C语言提供的位运算符列表:
& 按位与
如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

1. “按位与”运算符(&)
(1)清零(即所有位都不取)

若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。(可以和0进行与)

(2)取一个数中某些指定位
若有一个整数a(2byte),想要取其中的低字节,只需要将a与8个1按位与即可。
a 00101100 10101100
b 00000000 11111111
c 00000000 10101100

char valid = ((ch[0] & 128) != 0); // 128: 1 << 8 取第7位有效位

(3)保留指定位:
与一个数进行“按位与”运算,此数在该位取1.
例如:有一数84,即01010100(2),想把其中从左边算起的第3,4,5,7,8位保留下来,运算如下:
01010100(2)
&00111011(2)
00010000(2)

float vehicleSpeed = (((ch[0] & 127) << 8) | ch[1]) * 0.015625; // 127: 0111 1111 高八位和第八位结合

2. “按位或”运算符(|)
两个相应的二进制位中只要有一个为1,该位的结果值为1。借用逻辑学中或运算的话来说就是,温暖的小伙为真
应用:按位或运算常用来对一个数据的某些位定值为1。


3、交换两个值,不用临时变量
例如:a=3,即11(2);b=4,即100(2)。
想将a和b的值互换,可以用以下赋值语句实现:
c语言源代码:

#includemain(){int a=3;int b = 4;a=a^b;b=b^a;a=a^b;printf("a=%d b=%d",a,b);}
① 执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)。
② 再执行第三个赋值语句: a=a∧b。由于a的值等于(a∧b),b的值等于(b∧a∧b)
因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。

4、“取反”运算符(~)
他是一元运算符,用于求整数的二进制反码,即分别将操作数各二进制位上的1变为0,0变为1。

5、左移运算符(<<)
左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。

6、右移运算符(>>)
右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。
对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。
对无符号数,右移时左边高位移入0;

例: a的值是八进制数113755:
   a:1001011111101101 (用二进制形式表示)
   a>>1: 0100101111110110 (逻辑右移时)
   a>>1: 1100101111110110 (算术右移时)
Turbo C和其他一些C编译采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1。

7、位运算赋值运算符
位运算符与赋值运算符可以组成复合赋值运算符。
   例如: &=, |=, >>=, <<=, ∧=


 判断某个标志是否打开

#ifndef FlagOn
#define FlagOn(_F,_SF)        ((_F) & (_SF))
#endif

 #ifndef BooleanFlagOn
#define BooleanFlagOn(F,SF)   ((BOOLEAN)(((F) & (SF)) != 0))
#endif

 设置标志

#ifndef SetFlag
#define SetFlag(_F,_SF)       ((_F) |= (_SF))
#endif

 清除标志(~为取反)

#ifndef ClearFlag
#define ClearFlag(_F,_SF)     ((_F) &= ~(_SF))
#endif


实战例子:

#include <stdio.h>int main(void){unsigned char ch[2] = {0xff, 0xff}; // bit from 0-15;char valid = ((ch[0] & 128) != 0); // 128: 1 << 8 取第7位有效位//Vehicle Speed Average Driven VehSpdAvgDrvn 0 6 15 UNM 0 - 511.984375 km/h E = N * .015625float vehicleSpeed = (((ch[0] & 127) << 8) | ch[1]) * 0.015625; // 127: 0111 1111 高八位和第八位结合printf("valid is %d, vehicleSpeed is %fn ", valid, vehicleSpeed);return 0;}



版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。