嵌入式笔试刷题第(25天)

第1题:按位翻转一个 unsigned char 数值

写一个函数,把 unsigned char num 的位进行整体翻转,不使用额外变量。

示例:

输入:num = 0b10010111  
输出:num = 0b11101001

解法(最优):使用位运算 + 掩码 + 位移

unsigned char reverseBits(unsigned char num) {
    num = (num & 0xF0) >> 4 | (num & 0x0F) << 4;
    num = (num & 0xCC) >> 2 | (num & 0x33) << 2;
    num = (num & 0xAA) >> 1 | (num & 0x55) << 1;
    return num;
}

解析:逐层交换半字节、2位、1位,利用位运算达到最优翻转,不使用额外变量

第2题:判断字符串中括号是否匹配(非递归)

输入示例:({})[] → 匹配

解法:使用栈结构

#include <stdio.h>
#include <string.h>

int isValid(char *str) {
    char stack[100];
    int top = -1;

    for (int i = 0; str[i]; i++) {
        char c = str[i];
        if (c == '(' || c == '{' || c == '[')
            stack[++top] = c;
        else if (c == ')' && top >= 0 && stack[top] == '(')
            top--;
        else if (c == '}' && top >= 0 && stack[top] == '{')
            top--;
        else if (c == ']' && top >= 0 && stack[top] == '[')
            top--;
        else
            return 0;
    }
    return top == -1;
}

第3题:实现循环缓冲区的 Write 函数

结构定义:

typedef struct RingBuf {
    char *Buf;
    unsigned int Size;
    unsigned int RId;
    unsigned int WId;
} RingBuf;

解法:

void Write(RingBuf *ringBuf, char ch) {
    ringBuf->Buf[ringBuf->WId] = ch;
    ringBuf->WId 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式笔试专栏 文章被收录于专栏

本专栏系统整理了嵌入式方向笔试中常见的知识点和高频考题,涵盖基础理论、常用算法、C语言陷阱、操作系统原理、驱动开发、常见外设通信协议(如 I2C/SPI/UART)、RTOS、Linux 内核、以及实用电路知识等内容。

全部评论
点赞 回复 分享
发布于 04-25 21:44 山西
mark一下解法
点赞 回复 分享
发布于 04-25 17:30 黑龙江

相关推荐

不愿透露姓名的神秘牛友
07-10 11:27
明天又是董事长面,啥时候是个头啊
在太阳里长大的人:公司就仨人吧😂
点赞 评论 收藏
分享
点赞 评论 收藏
分享
06-20 17:42
东华大学 Java
凉风落木楚山秋:要是在2015,你这简历还可以月入十万,可惜现在是2025,已经跟不上版本了
我的简历长这样
点赞 评论 收藏
分享
07-02 22:46
门头沟学院 Java
码农索隆:hr:“管你投没投,先挂了再说”
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务