C语言按位左移运算规则

Python016

C语言按位左移运算规则,第1张

C语言中按位左移的运算符为<<,其规则如下:

对于操作a<<n,

1 按照二进制值每位向高位(书写上是向左)移动n位;

2 最高位(最左边的)n位舍去;

3 最低位(最右边)填加n个0.

简单起见,用char型举例如下:

例一

0x12 <<3 =>

B00010010 <<3 =>

B10010 000(这里最高位的三个0被舍去,其它依次左移,最低位补三个0) =>

0x90

即0x12 <<3 = 0x90

例二

0x9E <<2 =>

B10011110 <<2 =>

B01111000 (最高位10舍去,最低位补两个0)=>

0x78

可以编写如下程序验证:

#include <stdio.h>

void check(char a, int n)

{

    printf("0x%hhx << %d = 0x%hhx\n", a, n, a<<n)

}

int main()

{

    check(0x12, 3)

    check(0x9e, 2)

    

    return 0

}

其运行结果

0x12 << 3 = 0x90

0x9e << 2 = 0x78

可以看到与我们计算结果是相符的。

假设0010

左移就是把二进制数向左移动,右边补0,0的二进制全是0,左移之后右边再补0。

0010<<2 就是1000 实际是做的*4。

1000>>2 计算 0010 实际做的是/4。

位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。

位移位运算符的运算对象、运算规则与结果、结合性如表2-16所示。

移位时,移出的位数全部丢弃,移出的空位补入的数与左移还是右移花接木有关。如果是左移,则规定补入的数全部是0;如果是右移,还与被移位的数据是否带符号有关。若是不带符号数,则补入的数全部为0;若是带符号数,则补入的数全部等于原数的最左端位上的原数(即原符号位)。具体移位规则如下所示。

位移位运算符的优先级如下:

·算术运算符 优先于 位移位运算符 优先于 关系运算符

·位移位运算符是同级别的,结合性是自左向右

例如,设无符号短整型变量a为0111(对应二进制数为0000000001001001),

则:a<<3 结果为01110(对应二进制数为0000001001001000),a不变

a>>4 结果为04 (对应二进制数为0000000000000100),a不变

又如,设短整型变量a为-4(对应二进制数为1111111111111100),

则:a<<3 结果为-32(对应二进制数为1111111111100000),a不变

a>>4 结果为-1(对应二进制数为1111111111111111),a不变

0<<5左移5位,即000000

0<<6左移6位,即0000000

左移后是用二进制表示的,

具体的这个程序中有什么用,应该看程序本身,

就像#define PI_FRMERR (0 <<5)

用000000代替PI_FRMERR可能与某个数进行与操作或其他的。