栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

如何让一个变量存储多个不同的状态

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何让一个变量存储多个不同的状态

前提:

  • 最近由于项目中用了4个芯片74HC165芯片(8路输入),构成一个32个输入按钮,因此在单片机中需要定义变量来保存这32个外部按钮输入的状态。

  • 按照以往,我可能会定义32个u8类型的数组,来保存每一个按钮的状态,这样会用掉32个字节。但是在单片机中RAM这么宝贵的资源,保持着能省一点是一点的原则,我想用一个u32变量(4个字节),表示每一个按钮的状态,还得保证按钮状态的存储和查询的方便性。

  • OK,废话不多说直接上代码

#include "stdio.h"

typedef  unsigned          char uint8_t;
typedef unsigned           int uint32_t;

//定义一个 u32类型的全局变量,并初始化
uint32_t g_bit32 = 0x00 ;


void Bit32Data_Insert( uint32_t* bit32 , uint8_t insert_value ,uint8_t insert_position ) ;


int lookValueOfOneBit( const uint32_t* bit32 ,uint8_t look_position ) ;

int main()
{
    //               操作对象  赋值 位置
	Bit32Data_Insert(&g_bit32 , 1 , 0);
	Bit32Data_Insert(&g_bit32 , 1 , 1);
	Bit32Data_Insert(&g_bit32 , 1 , 31);
	
	//查看u32变量的某一个的值	
	printf("0 bit = %drn",lookValueOfOneBit(&g_bit32,0));
	printf("1 bit = %drn",lookValueOfOneBit(&g_bit32,1));
	printf("2 bit= %drn",lookValueOfOneBit(&g_bit32,2));
	
	printf("30 bit = %drn",lookValueOfOneBit(&g_bit32,30));
	printf("31 bit = %drn",lookValueOfOneBit(&g_bit32,31));
	
	return 0 ;
} 

void Bit32Data_Insert( uint32_t* bit32 , uint8_t insert_value ,uint8_t insert_position )
{
	uint8_t value ;  // 插入的值,0,或者 1
	uint8_t position = insert_position ;
	
	if( insert_position >= 32 ){ // 防越界
	return ;
	}
	
	if( insert_value ){ 
		value = 1 ;
	}else{
		value = 0 ;
	}
	
	if( value ) (*bit32) |=  0x00000001<< position ;
	else (*bit32) &=  ~( 0x00000001<< position ) ;
	
	// 打印一下u32变量的值 , 观察是否改变
	printf("bit32 = %x rn",*bit32);

}

int lookValueOfOneBit( const uint32_t* bit32 ,uint8_t look_position )
{
	uint8_t position = look_position ;
	uint32_t data = *bit32 ;
	if( look_position >= 32 ){ // 防越界
	return -1;
	}
	
	if( data & (0x00000001<< look_position) ){
		return 1 ;  // 当前bit(位) 为 1
	}
	return 0 ;  // 当前bit(位) 为 0
}


预测结果:
当程序执行到下面三行时

 //               操作对象  赋值 位置
	Bit32Data_Insert(&g_bit32 , 1 , 0);
	Bit32Data_Insert(&g_bit32 , 1 , 1);
	Bit32Data_Insert(&g_bit32 , 1 , 31);
  • 应该会输出:

bit32 = 1 // ( 00000000 00000000 00000000 00000001 )
bit32 = 3 // ( 00000000 00000000 00000000 00000011 )
bit32 = 80000003 // ( 10000000 00000000 00000000 00000011 )

运行到接下来这5行时:

//查看u32变量的某一个的值	
printf("0 bit = %drn",lookValueOfOneBit(&g_bit32,0));
printf("1 bit = %drn",lookValueOfOneBit(&g_bit32,1));
printf("2 bit= %drn",lookValueOfOneBit(&g_bit32,2));

printf("30 bit = %drn",lookValueOfOneBit(&g_bit32,30));
printf("31 bit = %drn",lookValueOfOneBit(&g_bit32,31));
  • 应该会输出:

0 bit = 1
1 bit = 1
2 bit = 0
30 bit = 0
31 bit = 1

看看编译的结果:

结论:
可以看到预测的结果和实际输出的结果完全一致,大家如果有需要这样的功能的话,上面的代码可以放心使用。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968682.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号