首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用按位操作在`uint16_t`上存储和读回多个数值?

uint16_t上存储和读回多个数值可以使用按位操作。按位操作是指对二进制数的每一位进行操作,包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)等。

要在uint16_t上存储多个数值,可以使用按位或(|)操作将不同的数值按位合并到一个变量中。例如,假设要存储数值1、2和4,可以使用以下代码:

代码语言:txt
复制
uint16_t value = 0;
value |= 1;  // 存储数值1
value |= 2;  // 存储数值2
value |= 4;  // 存储数值4

在这个例子中,value变量的二进制表示为0000000000000111,其中每一位代表一个数值是否存在。

要从uint16_t中读回存储的数值,可以使用按位与(&)操作和逻辑判断来提取每个数值。例如,要读回存储的数值,可以使用以下代码:

代码语言:txt
复制
if (value & 1) {
    // 数值1存在
}

if (value & 2) {
    // 数值2存在
}

if (value & 4) {
    // 数值4存在
}

在这个例子中,通过按位与(&)操作将value与对应的数值进行比较,如果结果为非零,则表示该数值存在。

按位操作在存储和读回多个数值时非常高效,并且可以节省存储空间。它常用于标志位的处理和位图操作等场景。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云官网:https://cloud.tencent.com/
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Metaverse):https://cloud.tencent.com/product/metaverse

请注意,以上链接仅供参考,具体产品选择应根据实际需求进行评估。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

分享STM32 FLASH 擦除(以及防止误擦除程序代码)、写入

编译环境:我用的是(Keil)MDK4.7.2 stm32库版本:我用的是3.5.0 一、本文不对FLASH的基础知识做详细的介绍,不懂得地方请查阅有关资料。   对STM32 内部FLASH进行编程操作,需要遵循以下流程:   FLASH解锁   清除相关标志位   擦除FLASH(先擦除后写入的原因是为了工业上制作方便,即物理实现方便)   写入FLASH   锁定FLASH 实例: #define FLASH_PAGE_SIZE ((uint16_t)0x400) //如果一页为1K大小 #define WRITE_START_ADDR ((uint32_t)0x08008000)//写入的起始地址 #define WRITE_END_ADDR ((uint32_t)0x0800C000)//结束地址 uint32_t EraseCounter = 0x00, Address = 0x00;//擦除计数,写入地址 uint32_t Data = 0x3210ABCD;//要写入的数据 uint32_t NbrOfPage = 0x00;//记录要擦除的页数 volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;/*FLASH擦除完成标志*/ void main() { /*解锁FLASH*/  FLASH_Unlock(); /*计算需要擦除FLASH页的个数 */  NbrOfPage = (WRITE_END_ADDR - WRITE_START_ADDR) / FLASH_PAGE_SIZE; /* 清除所有挂起标志位 */   FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); /* 擦除FLASH 页*/  for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)    {    FLASHStatus = FLASH_ErasePage(WRITE_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter));    } /* 写入FLASH */  Address = WRITE_START_ADDR;  while((Address < WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE))    {    FLASHStatus = FLASH_ProgramWord(Address, Data);    Address = Address + 4;    } /* 锁定FLASH */  FLASH_Lock(); } 二、FLASH 擦除(以及防止误擦除程序代码) 1、擦除函数 FLASH_Status FLASH_ErasePage(u32 Page_Address)只要()里面的数是flash第xx页中对应的任何一个地址!就是擦除xx页全部内容! 防止误擦除有用程序代码的方法 方法一:首先要计算程序代码有多少,把FLASH存取地址设置在程序代码以外的地方,这样就不会破坏用户程序。原则上从0x0800 0000 + 0x1000 以后的FLASH空间都可以作为存储使用。如果代码量占了 0x3000, 那么存储在 0x0800 0000+ 0x4000 以后的空间就不会破坏程序了。 方法二:先在程序中定义一个const 类型的常量数组,并指定其存储位置(方便找到写入、读取位置),这样编译器就会分配你指定的空间将常量数组存入FLASH中。当你做擦除。读写操作时,只要在这个常量数组所在的地址范围就好。   const uint8_t table[10] __at(0x08010000) = {0x55} ;   MDK3.03A开始就支持关键字 __at() 。   需要加#include <absacc.h> 方法三:在程序中定义一个const 类型的常量数组,无需指定其存储位置。只要定义一个32位的变量存储这个数组的FLASH区地址就行。   uint32_t address;//STM32的地址是32位的   const uint8_t imageBuffer[1024] = {0,1,2,3,4,5,6,7};   address = (uint32_t) imageBuffer;/*用强制类型转换的方式,可以把FLASH中存储的imageBuffer[1024]的地址读到RAM中的变量address 里,方便找到写入、读取位

05

[GPIO]推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷,无需用户计算位置

优势1: 比如我们在地址0x2000 0000定义了一个变量unit8_t a, 如果我们要将此变量的bit0清零,而其它bit不变。 a & = ~0x01 这个过程就需要读变量a,修改bit0,然后重新赋值给变量a,也就是读 - 修改 - 写经典三部曲,如果我们使用硬件位带就可以一步就完成,也就是所谓的原子操作,优势是不用担心中断或者RTOS任务打断。 优势2: 操作便捷,适合用于需要频繁操作修改的场合,移植性强。不频繁的直接标准库或者HAL库配置即可。 背景知识 这个点知道不知道都没有关系,不影响我们使用硬件位带,可以直接看下面案例的操作方法,完全不需要用户去了解。 位带操作就是对变量每个bit的操作,以M4内核的STM32F4为例: (1)将1MB地址范围 0x20000000 - 0x200FFFFF 映射到32MB空间范围0x22000000 - 0x23FFFFFF ----> 这个对应STM32F4的通用RAM空间。 也就是说1MB空间每个bit都拓展为32bit来访问控制

03
领券