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

打印 上一主题 下一主题

主题 960|帖子 960|积分 2880

某日二师兄参加XXX科技公司的C++工程师开发岗位第12面:
面试官:了解位运算吗?
二师兄:了解一些。(我很熟悉)
面试官:请列举以下有哪些位运算?
二师兄:按位与(&)、按位或(|)、按位异或(^),按位取反(~)、左移()。
面试官:好的。那你知道位运算有什么优势吗?
二师兄:优势主要有两点:1.速度快。2.节省寄存器/内存空间。
面试官:在C++中,如何处理int型负数最高位(是1)的左移或者右移?
二师兄:不同编译器处理的方法不同。此操作在C++中属于未定义的行为。所以不要使用带符号的整数参加位运算。
面试官:如何判断一个数是不是2的整数次方?
二师兄:使用这个数与这个数-1按位与,如果结果是0,则这个数是2的整数次方,否则不是。
  1. bool is_power_of_two(unsigned int n)
  2. {
  3.     return n & (n-1) == 0;
  4. }
复制代码
面试官:如何使用位运算交换两个数,而不能申请额外的空间?
二师兄:可以使用异或操作,原理是一个数异或两次同一个数,结果等于原值。
  1. void swap(unsigned int& a, unsigned int& b)
  2. {
  3.     a = a ^ b;        // a = a ^ b;
  4.     b = a ^ b;        // b = a ^ b ^ b = a;
  5.     a = a ^ b;        // a = a ^ b ^ a = b;
  6. }
复制代码
面试官:如何获取一个数字中的某一位是0 还是1 ?
二师兄:把这个数字右移x位,然后与&1。
  1. bool get_bit(unsigned int n, unsigned int x)
  2. {
  3.     return 1 & (n >> x);
  4. }
复制代码
面试官:如何将一个数的某一位置成1/置成0,或取反?
二师兄:沉思良久。。。想不起来了。。。
今日二师兄的表现还不错,除了最后一问,其他都答上来了。让我们看看最后一问吧:
如何将一个数的某一位置成0/置成1,或取反?
先看第一个,如何将一个数的某一位置成1?这个数的这一位要不是1要不是0,最终要变成1,那么可以考虑在这一位上构造个1,然后和这个数或,这一位就置成了1。
[code]unsigned set_bit_1(unsigned int n, unsigned int x){    return (1u
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表