乐趣区

关于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 ++ 面试生涯。

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

退出移动版