当前位置: 首页 > news >正文

C语言实现卡ID删除与排序

实现任务:

typedef struct
{uint8_t 			bindflag;	uint8_t 			userCardNumber;		 //当前用户卡的数据uint32_t 			userCardId[7];//当前6个用户的卡ID
}USER_NFC;
结构体中bindflag从高到低的的高七位bit表示数组userCardId中低到高卡ID的启用禁用状态,userCardNumber表示当前卡数,若完成任意卡ID的删除后,对bindflag与数组userCardId内容重新对应排序

  1. 根据 bindflag 的高七位 bit 来管理 userCardId 数组中卡 ID 的启用/禁用状态

  2. 删除指定的卡 ID 后,需要重新排序数组,将有效的卡 ID 移到数组前面

  3. 更新 userCardNumber 为当前有效的卡数

  4. 更新 bindflag 使其高七位 bit 与新排序后的卡 ID 状态对应

以下是实现这个功能的 C 语言程序:

#include <stdio.h>
#include <stdint.h>
#include <string.h>typedef struct
{uint8_t bindflag;uint8_t userCardNumber;     // 当前用户卡的数据uint32_t userCardId[7];     // 当前6个用户的卡ID
} USER_NFC;// 函数:删除指定卡ID并重新排序
void deleteAndReorderCard(USER_NFC *nfc, uint32_t cardIdToDelete)
{uint8_t newBindflag = 0;uint8_t newCardCount = 0;uint32_t tempCardId[7] = {0};// 第一步:筛选出未被删除且有效的卡IDfor (int i = 0; i < nfc->userCardNumber; i++) {// 检查当前卡是否启用 (bindflag的第(7-i)位是否为1)uint8_t mask = 1 << (7 - i);if ((nfc->bindflag & mask) && (nfc->userCardId[i] != cardIdToDelete)) {tempCardId[newCardCount] = nfc->userCardId[i];// 设置新bindflag的对应位newBindflag |= (1 << (7 - newCardCount));newCardCount++;}}// 第二步:更新结构体nfc->userCardNumber = newCardCount;nfc->bindflag = newBindflag;// 复制有效的卡ID到原数组,后面清零memcpy(nfc->userCardId, tempCardId, sizeof(uint32_t) * newCardCount);if (newCardCount < 7) {memset(nfc->userCardId + newCardCount, 0, sizeof(uint32_t) * (7 - newCardCount));}
}
// 打印结构体内容用于调试
void printNfcInfo(const USER_NFC *nfc)
{printf("bindflag: 0x%02X\n", nfc->bindflag);printf("userCardNumber: %d\n", nfc->userCardNumber);printf("userCardId: ");for (int i = 0; i < 7; i++) {printf("%08X ", nfc->userCardId[i]);}printf("\n");// 打印每个位的状态printf("Bit status: ");for (int i = 0; i < 7; i++) {printf("%d ", (nfc->bindflag & (1 << (7 - i))) ? 1 : 0);}printf("\n\n");
}
int main()
{// 测试用例USER_NFC nfc = {.bindflag = 0xE0,  // 二进制: 11100000 (前3位启用).userCardNumber = 3,.userCardId = {0x11111111, 0x22222222, 0x33333333, 0, 0, 0, 0}};printf("Before deletion:\n");printNfcInfo(&nfc);// 删除卡ID 0x22222222deleteAndReorderCard(&nfc, 0x22222222);printf("After deletion:\n");printNfcInfo(&nfc);return 0;
}

程序说明:

  1. deleteAndReorderCard 函数

    • 遍历当前的卡ID数组,检查每个卡ID是否启用且不是要删除的卡

    • 将有效的卡ID复制到临时数组,并设置新的bindflag对应位

    • 更新结构体的各个字段

  2. bindflag处理

    • 原bindflag的高七位bit表示数组中卡ID的启用状态

    • 删除卡ID后,新的bindflag会重新排列,确保其高七位bit与新数组顺序对应

  3. 数组处理

    • 有效的卡ID会被移到数组前面

    • 数组后面的位置会被清零

  4. 测试用例

    • 初始化了一个有3个卡ID的结构体

    • 删除其中一个卡ID后,结构体会自动重新排序

这个程序可以正确处理卡ID的删除、数组重排和bindflag更新。如果需要删除多个卡ID,可以多次调用这个函数。

http://www.xdnf.cn/news/201187.html

相关文章:

  • 高压场景首选:CKESC ROCK 120A-H CAN 电调技术解析与实测报告
  • 浅谈链表的优化技巧
  • Python对字典列表按某个字段排序
  • 假云阴影模拟
  • MYSQL-OCP官方课程学习截图
  • PCIe-8634四口千兆PoE以太网卡的性能与应用分析
  • 机器学习概述
  • vue3代码规范管理;基于vite和vue3、 eslint、prettier、stylelint、husky规范;git触发eslint校验
  • 铭依眼科亮相“中华眼科菁英“.创新思路赋能近视矫正新高度
  • 光学涡旋干涉仪
  • 鹧鸪云光伏项目智慧施工软件:数字化驱动的光伏建设新范式
  • 数据可视化大屏——物流大数据服务平台
  • 课堂案例分析
  • 01《音量控制器》Unity
  • python使用dlib的5点和68点的人脸检测
  • 2020南京区域赛vp
  • Linux系统之----程序地址空间
  • mac 基于Docker安装minio服务器
  • JavaWeb:vueaxios
  • MetaEditor - 自动交易和技术指标编辑器
  • 知识体系_用户研究_用户体验度量模型
  • Python3:Jupyterlab 安装和配置
  • Java并发探索--上篇
  • SD04_CurSor提示词
  • 计算字符串的编辑距离和单向链表中倒数第k个结点
  • 普推知产:商标驳回复审下初步审定公告了!
  • 【C++】Googletest应用
  • python+selenium的web自动化之元素的常用操作
  • 人物5_My roommate
  • 【java】接口