1.7 C/C++ 数组 && 位操作

一、以下代码表示什么意思?

*(a[1]+1)、*(&a[1][1])、(*(a+1))[1]
*(a[1]+1):相当于a[1][1]
*(&a[1][1]):相当于 a[1][1]
(*(a+1))[1]:相当于 a[1][1]
//&a指向的是整个二维数组的地址;a指向的是二维数组的第一行起始地址;a[1]指向的是第一行第一个元素的起始地址;a[1][1]:对第一行第一个元素取值

二、数组下标可以为负数吗?

可以。数组下标只是相当于当前数组起始地址的偏移量而已。可能代表向前寻址。

三、数组如果在栈上分配,其大小必须在编译时确定

char* getBuffer(int size) {
    char a[size];
    return a;
}
// 两个错误:
// 1、a 是局部变量,作为了返回值
// 2、数组如果是在栈上分配,必须在编译时确定大小。

四、求解整型数二进制中 1 的个数

#include <stdio.h>

// 方法一:逐位检查
int countOnes1(int num) {
    int count = 0;
    for (int i = 0; i < sizeof(int) * 8; i++) {
        if (num & (1 << i)) {
            count++;
        }
    }
    return count;
}

// 方法二:Brian Kernighan 算法
int countOnes2(int num) {
    int count = 0;
    while (num) {
        num &= (num - 1);
        count++;
    }
    return count;
}

int main() {
    int num = 15;
    int result1 = countOnes1(num);
    int result2 = countOnes2(num);
    printf("使用逐位检查法,整数 %d 的二进制中 1 的个数是: %d\n", num, result1);
    printf("使用 Brian Kernighan 算法,整数 %d 的二进制中 1 的个数是: %d\n", num, result2);
    return 0;
}

五、求解整型数二进制中 0 的个数

#include <stdio.h>

// 方法一:逐位检查
int countZeros1(int num) {
    int count = 0;
    for (int i = 0; i < sizeof(int) * 8; i++) {
        if (!(num & (1 << i))) {
            count++;
        }
    }
    return count;
}

// 计算整数二进制中 1 的个数
int countOnes(int num) {
    int count = 0;
    while (num) {
        num &= (num - 1);
        count++;
    }
    return count;
}

// 方法二:先计算 1 的个数,再用总位数减去 1 的个数
int countZeros2(int num) {
    return sizeof(int) * 8 - countOnes(num);
}

int main() {
    int num = 15;
    int result1 = countZeros1(num);
    int result2 = countZeros2(num);
    printf("使用逐位检查法,整数 %d 的二进制中 0 的个数是: %d\n", num, result1);
    printf("使用先计算 1 的个数再相减法,整数 %d 的二进制中 0 的个数是: %d\n", num, result2);
    return 0;
}

六、交换两个变量的值,不使用第三个变量。即 a=3, b=5,交换之后 a=5, b=3;

a = a^b;
b = a^b;
a = a^b;

七、给定一个整型变量 a,写两段代码,第一个设置 a 的 bit 3,第二个清除 a 的 bit 3。在以上两个操作中,要保持其它位不变。

a = a | 0x1<<3
a = a & ~(0x1<<3)

C++/嵌入式开发 秋招面经 文章被收录于专栏

一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。

全部评论

相关推荐

查看7道真题和解析
点赞 评论 收藏
分享
昨天 00:06
合肥工业大学 C++
1.&nbsp;自我介绍1.5&nbsp;面试官特意提了一嘴一面面试官给我的面评,不知道何意味?2.&nbsp;项目相关(有些记不清了,下面这些应该不全)2.1&nbsp;总体介绍项目2.2&nbsp;io_uring和epoll的对比,为什么选用io_uring,讲讲心路历程2.3&nbsp;协程与线程的区别2.4&nbsp;Raft共识算法与Paxos的对比2.5&nbsp;Raft如何保持数据一致性2.6&nbsp;Raft为什么在高并发情况下性能下降3.&nbsp;设计题:(面试官让共享屏幕直接使用agent作答,估计是想看看我平时是怎么使用agent的)3.1&nbsp;使用agent设计一个社交平台的用户好友关系、关注信息的系统3.2&nbsp;假如一个几千万粉丝的大V发动态了,怎么让关注了他的用户接收到他的更新(涉及什么推拉结合)3.3&nbsp;根据agent给出的系统架构(Redis+DB),如果Redis整个集群挂了,所有用户请求直接打到数据库中,会导致数据库崩溃,设计限流机制。4.&nbsp;反问:4.1&nbsp;部门用Go吗?(问这个问题是为了向面试官表示我正在主动积极学Go,刷个印象分)4.2&nbsp;agent对行业的冲击,同事之间会讨论吗,你们对agent代替程序员的看法?4.3&nbsp;目前实际生产中agent的参与程度4.4&nbsp;后续流程(这里面试官直接说后面等HR面嘻嘻)无手撕,很惊喜,因为一面手撕没撕出来以为二面还会狠狠拷打算法注:最后的设计题我答得稀烂,业务层面的设计、Redis和数据库我都不怎么了解,虽然我在看Java面经的时候经常看到这些业务设计题,但没有意识去刻意了解。后来跟面试官坦白说因为学的C++,没怎么关注业务层面,面试官人很好,表示理解。感谢面试官(还有面试官长得像桑杰,我一看他就想笑),还是要补补后端业务层面的知识!冲冲冲!!!后续:二面面完两小时秒过,约HR面
查看13道真题和解析
点赞 评论 收藏
分享
03-25 18:55
已编辑
中国农业大学 Java
稳稳的寄了。Q:你的&nbsp;Agent&nbsp;具备上下文记忆功能,基于&nbsp;ReAct&nbsp;模式,目前实际运行中最多能支持多少轮对话?Q:在&nbsp;ReAct&nbsp;模式下,Agent&nbsp;需要频繁调用工具。考虑到不同大模型(如&nbsp;Kimi&nbsp;支持&nbsp;20&nbsp;万+&nbsp;token,DeepSeek&nbsp;支持&nbsp;10&nbsp;万+&nbsp;token)的上下文窗口限制,您在执行过程中是否遇到过因工具调用次数过多(N&nbsp;次)导致&nbsp;Token&nbsp;超出限制(撑爆上下文)的情况?如果有,是如何处理的?Q:在问答类场景中,如果&nbsp;Agent&nbsp;陷入死循环(例如反复搜索不到内容,不断重复“查看文件&nbsp;-&nbsp;搜索文件”的操作),有什么机制来检测并处理这种异常情况?Q:项目基于&nbsp;MCP&nbsp;协议集成了服务器资源查询、数据操作和校内文档检索,为什么没有考虑集成外部互联网资源的检索能力?Q:像&nbsp;Codex&nbsp;这类代码模型,其内部显然不是基于向量检索的。您是否研究或思考过&nbsp;Codex&nbsp;内部的文件检索策略是如何实现的?Q:目前&nbsp;OpenClaw&nbsp;比较热门,您是否阅读过相关源码或研究过其技术实现?Q:您提到了“服务器辅助开发”功能,是基于&nbsp;Plan-Execute-RePlan&nbsp;的方式实现的。能否详细讲解一下这一功能的具体实现逻辑?Q:你实现的“Plan-Execute-RePlan”流程与&nbsp;Minus&nbsp;这种有什么区别?
查看8道真题和解析
点赞 评论 收藏
分享
03-20 13:37
门头沟学院 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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