我遇到了这样一个编程面试问题。但对我来说,如何知道如何在这里使用位移是不明显的。 有人好心解释。谢谢。
数组的大小为N,整数在0到1024之间(允许重复)。另一个整数数组的大小为M,对数字没有限制。查找第一个数组中哪些元素存在于第二个数组中。 (如果您正在使用额外的内存,请考虑使用按位运算符来最小化)
我想知道现实世界中的bitshift运算符是什么意思。以及如何识别需要比特移位方法的问题。
由于 桑杰
答案 0 :(得分:5)
这真是一个非常简单的面试问题。因为您知道第一组中最多有1025个不同的整数,所以您可以使用该位数来表示在输入集中是否找到每个数字。因此,如果您希望答案只打印一次不同的数字,那么逻辑是:
现在,您的语言可能不会直接支持创建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.你可以:
if (array[k / 8] & (1 << (k % 8))) ...it's on...
array[k / 8] |= (1 << (k % 8));
如果在任何一组中碰巧有少于1025个值,有更有效的方法可以做到这一点,但这是一个很好的通用解决方案。
答案 1 :(得分:1)
Bitshift运营商的工作方式如下。想象一下,你有一个整数值X.这个X将以二进制形式表示,它是1和0。根据班次操作员的话后。职位数量将被移动。
访问此链接http://www.php.net/manual/en/language.operators.bitwise.php他们有一些关于这种转变运营商如何运作的例子。