嵌入式学习day05

本文介绍了C++中结构体的三种赋值方式,包括初始化、字段赋值和结构体变量赋值。同时讲解了结构体位域的概念,展示了如何利用位域节省存储空间。此外,还提供了回文排列问题的解决方案,涉及字符串处理和哈希表的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每日面试题

结构体的赋值方式

①初始化,如:

struct st{
	char a;
	int b; 
}x={'A',1};

②定义变量后按字段赋值,如:

struct st{
	char a;
	int b;
};
struct st x;
x.a='A';
x.b=1;

③结构体变量的赋值,如:

struct st{
	char a;
	int b;
};
struct st x,y;
x.a='A';
x.b=1;
y=x;

结构体位域

结构体位域是一种数据类型,它允许在一个字节中存储多个不同长度的字段。例如:

struct DeviceStatus {  
    unsigned int isOn : 1;      // 设备是否开启,1位  
    unsigned int hasFault : 1;  // 设备是否有故障,1位  
    unsigned int lowPower : 1;  // 是否处于低功耗模式,1位  
    unsigned int reserved : 5;  // 保留位,5位(用于对齐或其他目的)  
};  

位域的好处:
①并不需要完整的字节,节省存储空间,处理简单。
②方便利用位域把一个变量按位域分解,例如:

#include <stdio.h>  
  
// 定义包含位域的结构体  
struct BitFields {  
    unsigned int bit0 : 1; // 第0位  
    unsigned int bit1 : 1; // 第1位  
    unsigned int bit2 : 1; // 第2位  
    unsigned int bit3 : 1; // 第3位  
    unsigned int bit4 : 1; // 第4位  
    unsigned int bit5 : 1; // 第5位  
    unsigned int bit6 : 1; // 第6位  
    unsigned int bit7 : 1; // 第7位  
    // 可以继续定义更多位域,直到填满一个或多个整型变量的位数  
};  
  
int main() {  
    int originalVariable = 0b10110010; // 二进制表示,例如178(十进制)  
    struct BitFields bitFields;  
  
    // 将变量按位域分解并赋值给结构体的位域成员  
    bitFields.bit0 = (originalVariable >> 0) & 1;  //右移操作使我们需要得到的位数移到最低位,并与1相与得到最低位结果
    bitFields.bit1 = (originalVariable >> 1) & 1;  
    bitFields.bit2 = (originalVariable >> 2) & 1;  
    bitFields.bit3 = (originalVariable >> 3) & 1;  
    bitFields.bit4 = (originalVariable >> 4) & 1;  
    bitFields.bit5 = (originalVariable >> 5) & 1;  
    bitFields.bit6 = (originalVariable >> 6) & 1;  
    bitFields.bit7 = (originalVariable >> 7) & 1;  
  
    // 打印位域的值  
    printf("bit0: %u\n", bitFields.bit0);  
    printf("bit1: %u\n", bitFields.bit1);  
    printf("bit2: %u\n", bitFields.bit2);  
    printf("bit3: %u\n", bitFields.bit3);  
    printf("bit4: %u\n", bitFields.bit4);  
    printf("bit5: %u\n", bitFields.bit5);  
    printf("bit6: %u\n", bitFields.bit6);  
    printf("bit7: %u\n", bitFields.bit7);  
  
    return 0;  
}

每日算法

回文排列

给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。

class Solution {  
public:  
    bool canPermutePalindrome(string s) {  
        std::unordered_map<char, int> charCount;  
        int oddCount = 0;  
  
        // 统计每个字符出现的次数  
        for (char c : s) {  
            charCount[c]++;  //先检索c是否存在于map中,然后对值++
        }  
  
        // 检查出现奇数次的字符数量  
        for (const auto& pair : charCount) {  //const确保了不会意外地修改这些值,使用&引用避免了在每次迭代中复制std::pair<const char, int>对象,autp让编译器自动推断类型
            if (pair.second % 2 != 0) {  
                oddCount++;  
                if (oddCount > 1) {  
                    return false; // 如果超过一个字符出现奇数次,则不是回文串的排列  
                }  
            }  
        }  
  
        return true; // 最多只有一个字符出现奇数次,是回文串的排列  
    }  
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值