C++面试八股文:了解位运算吗?

文章描述了一次C++工程师面试过程,重点讨论了位运算的相关知识,包括位运算的类型、优势,以及如何利用位运算判断2的整数次方、交换两个数、获取和修改数字的特定位。二师兄成功解答了大部分问题,但在最后关于位取反的问题上稍显困惑。

某日二师兄参加XXX科技公司的C++工程师开发岗位第12面:

面试官:了解位运算吗?

二师兄:了解一些。(我很熟悉)

面试官:请列举以下有哪些位运算?

二师兄:按位与(&)、按位或(|)、按位异或(^),按位取反(~)、左移(<<)和右移(>>)。

面试官:好的。那你知道位运算有什么优势吗?

二师兄:优势主要有两点:1.速度快。2.节省寄存器/内存空间。

面试官:在C++中,如何处理int型负数最高位(是1)的左移或者右移?

二师兄:不同编译器处理的方法不同。此操作在C++中属于未定义的行为。所以不要使用带符号的整数参加位运算。

面试官:如何判断一个数是不是2的整数次方?

二师兄:使用这个数与这个数-1按位与,如果结果是0,则这个数是2的整数次方,否则不是。

bool is_power_of_two(unsigned int n)
{
    return n & (n-1) == 0;
}

面试官:如何使用位运算交换两个数,而不能申请额外的空间?

二师兄:可以使用异或操作,原理是一个数异或两次同一个数,结果等于原值。

void swap(unsigned int& a, unsigned int& b)
{
    a = a ^ b;    // a = a ^ b;
    b = a ^ b;    // b = a ^ b ^ b = a;
    a = a ^ b;    // a = a ^ b ^ a = b;
}

面试官:如何获取一个数字中的某一位是0 还是1

二师兄:把这个数字右移x位,然后与&1

bool get_bit(unsigned int n, unsigned int x)
{
    return 1 & (n >> x);
}

面试官:如何将一个数的某一位置成1/置成0,或取反?

二师兄:沉思良久。。。想不起来了。。。

今日二师兄的表现还不错,除了最后一问,其他都答上来了。让我们看看最后一问吧:

如何将一个数的某一位置成0/置成1,或取反?

先看第一个,如何将一个数的某一位置成1?这个数的这一位要不是1要不是0,最终要变成1,那么可以考虑在这一位上构造个1,然后和这个数或,这一位就置成了1

unsigned set_bit_1(unsigned int n, unsigned int x)
{
    return (1u << x) | n;
}

如何将一个数的某一位置成0呢?我们首先考虑到与(&)操作。同样我们需要构造出来一个全是1的数字,然后再这一位上变成0,并与传入的参数进行与操作:

unsigned set_bit_0(unsigned n, unsigned x)
{
    return (~(1u << x)) & n;
}

最后一个问题,如果讲一个数的某一位取反?想到了取反,我们就想到了异或。任何数与1异或等于取反,任何数与0异或等于原数:

unsigned flip_bit(unsigned n, unsigned x)
{
    return (1u << x) ^ n;
}

好了,今日份面试到这里就结束了。二师兄自我感觉表现还行,晚上给自己加了个鸡腿。

关注我,带你走进二师兄的跌宕起伏的C++面试生涯。

关注我,带你21天“精通”C++!(狗头)

六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,详细介绍了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程的理论与Matlab代码实现过程。文档还涵盖了PINN物理信息神经网络在微分方程求解、主动噪声控制、天线分析、电动汽车调度、储能优化等多个工程与科研领域的应用案例,并提供了丰富的Matlab/Simulink仿真资源和技术支持方向,体现了其在多学科交叉仿真与优化中的综合性价值。; 适合人群:具备一定Matlab编程基础,从事机器人控制、自动化、智能制造、电力系统或相关工程领域研究的科研人员、研究生及工程师。; 使用场景及目标:①掌握六自由度机械臂的运动学与动力学建模方法;②学习人工神经网络在复杂非线性系统控制中的应用;③借助Matlab实现动力学方程推导与仿真验证;④拓展至路径规划、优化调度、信号处理等相关课题的研究与复现。; 阅读建议:建议按目录顺序系统学习,重点关注机械臂建模与神经网络控制部分的代码实现,结合提供的网盘资源进行实践操作,并参考文中列举的优化算法与仿真方法拓展自身研究思路。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二进制架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值