请问在C语言中如何实现带进位标志位的循环左移?

Python031

请问在C语言中如何实现带进位标志位的循环左移?,第1张

C51不能实现带进位的移位,有两种办法完成这个功能,一种是在C中嵌入汇编,另一种就是使用特殊写法。

在这里我只介绍使用C特殊写法完成左移或者右移的方法,请你参考,如果遇到问题,欢迎交流。

看下面的例子:

CY=ACC&1

...

CY=ACC&0x80

这两个语句编译后会产生带进位右移和左移指令,如果你的数据不是在这两个寄存器,请你根据情况变通。

例如:

unsigned char c

ACC=c

CY=ACC&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

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