C语言实现卡ID启用排序

任务:

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;
}

说明:

  1. sortUserCards函数

    • 根据 bindflag 的高七位比特位(bit6~bit0)重新排序 userCardId 数组。

    • 启用的卡(对应比特位为1)排在前面,禁用的卡(对应比特位为0)排在后面。

    • 更新 userCardNumber 为启用的卡数量。

  2. addNewCard函数

    • 将新卡添加到 userCardId 数组的末尾。

    • 根据 enabled 参数设置 bindflag 的对应比特位。

    • 调用 sortUserCards 重新排序。

  3. 示例

    • 在 main 函数中,添加几张卡并打印结果。

注意事项:

  • bindflag 的高七位比特位(bit6~bit0)分别对应 userCardId[0] 到 userCardId[6] 的启用状态。

  • 如果 userCardNumber 超过7,addNewCard 会直接返回,不添加新卡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值