任务:
typedef struct
{
uint8_t bindflag;
uint8_t userCardNumber; //当前用户卡的数据
uint32_t userCardId[7];//当前6个用户的卡ID
}USER_NFC;
结构体中bindflag从高到低的的高七位bit表示数组userCardId中低到高卡ID的启用禁用状态,userCardNumber表示当前卡数,写入一张新卡,对bindflag与数组userCardId内容重新对应排序
根据 bindflag
的高七位比特位来对 userCardId
数组进行重新排序,使得启用的卡 ID 排在前面,禁用的卡 ID 排在后面,并更新 userCardNumber
,可以按照以下步骤编写 C 语言程序:
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
typedef struct
{
uint8_t bindflag;
uint8_t userCardNumber; // 当前用户卡的数据
uint32_t userCardId[7]; // 当前6个用户的卡ID
} USER_NFC;
void sortUserCards(USER_NFC *user) {
uint32_t tempId[7] = {0}; // 临时数组用于存储排序后的卡ID
uint8_t enabledCount = 0; // 启用的卡数量
// 遍历高7位bit,将启用的卡ID放到前面
for (int i = 0; i < 7; i++) {
// 检查bindflag的第(6-i)位(因为高7位对应bit6~bit0)
if ((user->bindflag >> (6 - i)) & 0x01) {
tempId[enabledCount++] = user->userCardId[i];
}
}
// 将禁用的卡ID放到后面
uint8_t disabledPos = enabledCount;
for (int i = 0; i < 7; i++) {
if (!((user->bindflag >> (6 - i)) & 0x01)) {
tempId[disabledPos++] = user->userCardId[i];
}
}
// 更新userCardId数组和userCardNumber
for (int i = 0; i < 7; i++) {
user->userCardId[i] = tempId[i];
}
user->userCardNumber = enabledCount;
}
// 写入一张新卡
void addNewCard(USER_NFC *user, uint32_t newCardId, bool enabled) {
if (user->userCardNumber >= 7) {
return; // 已满,无法添加
}
// 添加新卡到第一个可用位置
user->userCardId[user->userCardNumber] = newCardId;
// 更新bindflag
if (enabled) {
user->bindflag |= (1 << (6 - user->userCardNumber));
} else {
user->bindflag &= ~(1 << (6 - user->userCardNumber));
}
user->userCardNumber++;
// 重新排序
sortUserCards(user);
}
int main() {
USER_NFC user = {
.bindflag = 0x00, // 初始所有卡禁用
.userCardNumber = 0,
.userCardId = {0}
};
// 示例:添加几张卡
addNewCard(&user, 0x11223344, true); // 启用
addNewCard(&user, 0x22334455, false); // 禁用
addNewCard(&user, 0x33445566, true); // 启用
printf("After adding cards:\n");
printf("bindflag: 0x%02X\n", user.bindflag);
printf("userCardNumber: %d\n", user.userCardNumber);
for (int i = 0; i < user.userCardNumber; i++) {
printf("Card %d: 0x%08X\n", i, user.userCardId[i]);
}
return 0;
}
说明:
-
sortUserCards函数:
-
根据
bindflag
的高七位比特位(bit6~bit0)重新排序userCardId
数组。 -
启用的卡(对应比特位为1)排在前面,禁用的卡(对应比特位为0)排在后面。
-
更新
userCardNumber
为启用的卡数量。
-
-
addNewCard函数:
-
将新卡添加到
userCardId
数组的末尾。 -
根据
enabled
参数设置bindflag
的对应比特位。 -
调用
sortUserCards
重新排序。
-
-
示例:
-
在
main
函数中,添加几张卡并打印结果。
-
注意事项:
-
bindflag
的高七位比特位(bit6~bit0)分别对应userCardId[0]
到userCardId[6]
的启用状态。 -
如果
userCardNumber
超过7,addNewCard
会直接返回,不添加新卡。