位移运算符

时间:2011-06-13 12:02:04

标签: bitwise-operators bit-shift

我遇到了这样一个编程面试问题。但对我来说,如何知道如何在这里使用位移是不明显的。 有人好心解释。谢谢。

数组的大小为N,整数在0到1024之间(允许重复)。另一个整数数组的大小为M,对数字没有限制。查找第一个数组中哪些元素存在于第二个数组中。 (如果您正在使用额外的内存,请考虑使用按位运算符来最小化)

我想知道现实世界中的bitshift运算符是什么意思。以及如何识别需要比特移位方法的问题。

由于 桑杰

2 个答案:

答案 0 :(得分:5)

这真是一个非常简单的面试问题。因为您知道第一组中最多有1025个不同的整数,所以您可以使用该位数来表示在输入集中是否找到每个数字。因此,如果您希望答案只打印一次不同的数字,那么逻辑是:

  • 将bitset A中的所有1025位归零
  • 对于第一组中的每个数字,在A
  • 中设置相应的位
  • 将bitset B中的所有1025位置零
  • 对于第二组中的每个数字int,在B
  • 中设置相应的位
  • for i从0到1024:如果在A和B中都设置了该位,则输出i作为答案的一部分

现在,您的语言可能不会直接支持创建1025位的位集,因此您有时需要使用的是一个字节数组,每个字节都有8位。然后,假设您要设置位“k”,您将在索引k / 8处找到该字节,然后将该位设置为位置k%8。要执行后者,您必须从位位置转换(0到7)到位值(位0表示值1,位1值2,位2值4 ...位7值128 - 所有2的幂)。要获得这些值,可以取数字1并将其保留在“位置”位置。那么,1&lt;&lt; 0仍然是1,而1 <&lt; 7是128.你可以:

  • 通过将移位的值与字节的值进行AND运算并查看是否得到非0结果来询问一个字节是否有该位开启 - 例如,在C和C ++中:if (array[k / 8] & (1 << (k % 8))) ...it's on...
  • 通过将值与字节进行或运算,在字节中的特定位位置记录1 - 在C和C ++中:array[k / 8] |= (1 << (k % 8));

如果在任何一组中碰巧有少于1025个值,有更有效的方法可以做到这一点,但这是一个很好的通用解决方案。

答案 1 :(得分:1)

Bitshift运营商的工作方式如下。想象一下,你有一个整数值X.这个X将以二进制形式表示,它是1和0。根据班次操作员的话后。职位数量将被移动。

访问此链接http://www.php.net/manual/en/language.operators.bitwise.php他们有一些关于这种转变运营商如何运作的例子。