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道真题和解析