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内容重新对应排序
-
根据
bindflag
的高七位 bit 来管理userCardId
数组中卡 ID 的启用/禁用状态 -
删除指定的卡 ID 后,需要重新排序数组,将有效的卡 ID 移到数组前面
-
更新
userCardNumber
为当前有效的卡数 -
更新
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;
}
程序说明:
-
deleteAndReorderCard 函数:
-
遍历当前的卡ID数组,检查每个卡ID是否启用且不是要删除的卡
-
将有效的卡ID复制到临时数组,并设置新的bindflag对应位
-
更新结构体的各个字段
-
-
bindflag处理:
-
原bindflag的高七位bit表示数组中卡ID的启用状态
-
删除卡ID后,新的bindflag会重新排列,确保其高七位bit与新数组顺序对应
-
-
数组处理:
-
有效的卡ID会被移到数组前面
-
数组后面的位置会被清零
-
-
测试用例:
-
初始化了一个有3个卡ID的结构体
-
删除其中一个卡ID后,结构体会自动重新排序
-
这个程序可以正确处理卡ID的删除、数组重排和bindflag更新。如果需要删除多个卡ID,可以多次调用这个函数。