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

Posted bujidao1128

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++面试八股文:了解位运算吗?相关的知识,希望对你有一定的参考价值。

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

某日二师兄参加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++面试八股文:了解位运算吗?的主要内容,如果未能解决你的问题,请参考以下文章

20位大厂面试官推荐的《Java面试八股文》到底有多牛?

C++ 八股文(简单面试题)

C++面试八股文快问快答のSTL篇

C++面试八股文快问快答の基础篇

《程序员面试金典(第6版)》面试题 08.04. 幂集(回溯算法,位运算,C++)不断更新

前端面试八股文_HTTP1.0HTTP1.1和HTTP2.0的区别