二进制中原码反码补码与左移右移
原反补码
在此之前要了解二进制中的正数和负数
在二进制码中,采用最高位是符号位的方法来区分正负数,正数的符号位为0、负数的符号位为1
例:
(+10110)B的原码=(010110)B
(-10110)B的原码=(110110)B
对于正数而言反码和补码一样,负数则是补码=(反码+1)
(+1110)B的原码=(01110)B 反码=(00001)B 补码=(00001)B
(-1110)B的原码=(11110)B 反码=(10001)B 补码=(10010)B
–3(8位二进制) 写补码和反码符号位不变
-3=(1000 0011)B原码 (1111 1100)B反码 (1111 1101)B补码
左移右移
左移是将进制数左移一位 C语言中左移符号:<<
0xff<<1:(1111 1111)B左移一位(1111 1110)B
即移多少位在后面补几个0;
右移是将进制数左移一位 C语言中左移符号:>>
0xff>>1:(1111 1111)B左移一位(0111 1111)B
即移多少位在前面补几个0;
若利用移位来控制led灯的流水灯程序
#include<reg52.h> // 头文件
#include<intrins.h> //移位函数
#define uchar unsigned char
#define uint unsigned int
#define led P0 //宏定义
uint i;
sbit HC138_A=P2^5; //led灯锁存器的选通
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;
void delay(uint a) //延时函数
{
while(a--);
}
void ledrun() //流水灯程序
{
for(i=0;i<8;i++)
{
led=~(0x01<<i);
delay(50000);
}
}
void main()
{
P2=0xA0;
P0=0x00;
P2=0x00;
HC138_A=0;
HC138_B=0;
HC138_C=1;
P0=0x01;
while(1)
{
ledrun();
}
}
若想用#include<intrins.h> 移位函数来控制小灯则流水灯程序:
void ledrun()
{
led=_crol_(led,1);
delay(5000);
}
此函数能直接让移位操作
例:
led=0xb6=1011 0110B
led=_crol_(led,1);
则led=(0110 1101);
右移则同理!