【2021-04-05】二进制中的原码反码补码与二进制数的左移右移

二进制中原码反码补码与左移右移

原反补码

在此之前要了解二进制中的正数和负数

在二进制码中,采用最高位是符号位的方法来区分正负数,正数的符号位为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);

右移则同理!

猜你喜欢

转载自blog.csdn.net/qq_56609666/article/details/115444336