在检查指定位置是不是设置位时,右移数字和左移位掩码哪个更好?

Posted

技术标签:

【中文标题】在检查指定位置是不是设置位时,右移数字和左移位掩码哪个更好?【英文标题】:Which one is better amongst right shifting the number and left shifting the bit mask when checking for whether is bit set at the specified position?在检查指定位置是否设置位时,右移数字和左移位掩码哪个更好? 【发布时间】:2021-05-19 14:11:18 【问题描述】:

我试图找出一个问题,它要求检查是否设置了第 k 位,我已经使用以下方式实现了: 左移蒙版

public static boolean leftShiftingMask(int num, int pos)
    return (num & (1 << pos)) != 0;
  

数字右移

public static boolean rightShiftingNumber(int num, int pos)
    return ((num >> pos) & 1) != 0;
  

现在,在这种情况下,两种方法都具有 O(1) 复杂度,但我只想知道将掩码左移到所需位置是否比将原始数字右移到所需位置更好,反之亦然更好还是两者相等?

还有一件事,在检查该位是否设置时,用户输入的位置应该从 0 还是 1 开始,因为位置值以 2 ^ 0 开始 例如: 2 的二进制是 10 并且要检查第 1 位,那么第 k 位应该是第 1 位(即二进制 1)还是第 0 位(第 k - 1)位(即二进制 0)?

【问题讨论】:

定义“更好”这个词?对你来说,在哪方面应该被认为更好? 永远不要旋转/移动你的数据,当它显然不需要时,只旋转/移动“位指针”pos @Eugene:我只是想知道在移位数字和移位位掩码之间哪个是好的做法? leftShiftingMask 可能映射到 BT 并且是查看它的最常见方式(在 C 中)。 “最佳方式”取决于结果的使用方式。 两者的pos 应以0 开头。 【参考方案1】:

你可以用一种更容易阅读的方式来做这件事(至少对我来说):

public static boolean bitSetOrNot(int num, int pos)
   BitSet bitSet = BitSet.valueOf(new long[]num);
   return bitSet.get(pos);
 

【讨论】:

这不能回答我的问题,我也不想使用 java API。我只是想用我自己的逻辑来更好地理解按位运算符的工作原理。 @AkshayaAmar 我明白了,让我们先看看你真正追求的是什么,一旦我明白了,我会编辑答案 哪个是好的做法。是移动数字还是移动位掩码还是两者都等效? @AkshayaAmar 我个人总是会选择leftShiftingMask。我实际上从未见过旋转数字的方法。 我在一些网站上看到了这样的数字轮换,这就是我问的原因......

以上是关于在检查指定位置是不是设置位时,右移数字和左移位掩码哪个更好?的主要内容,如果未能解决你的问题,请参考以下文章

转《python 位操作符 左移和右移 运算》

python怎么集体右移

总结——C语言操作符。

C语言 循环移位

有趣的移位操作!彻底弄懂各个移位操作符的使用方式

移位运算符