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

Java 检查位是否设置在指定位置时,右移数字和左移位掩码哪个更好?,java,bit-manipulation,Java,Bit Manipulation,我试图找出一个问题,该问题要求检查第k位是否已设置,我已使用以下方式实现: 左移遮罩 public static boolean leftShiftingMask(int num, int pos){ return (num & (1 << pos)) != 0; } 现在,在这种情况下,两种方法都有O(1)复杂度,但我只想知道,左移掩码到所需位置是否比右移原始数字到所需位置更好,反之亦然,或者两者都是等效的 还有一件事,在检查位是否设置时,用户输入的位置应该从

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

public static boolean leftShiftingMask(int num, int pos){
    return (num & (1 << pos)) != 0;
  }
现在,在这种情况下,两种方法都有O(1)复杂度,但我只想知道,左移掩码到所需位置是否比右移原始数字到所需位置更好,反之亦然,或者两者都是等效的

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

您可以用一种更容易阅读的方式(至少对我来说):


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



这并没有回答我的问题,我也不想使用JavaAPI。我只是想用我自己的逻辑来更好地理解逐位运算符的工作原理。@AkshayaAmar我明白了,让我们先看看你真正想要的是什么,一旦我明白了哪一个是好的做法,我就会编辑答案。是移位数字还是移位位掩码,或者两者都是等效的?@AkshayaAmar我个人总是选择
leftShiftingMask
。事实上,我从来没有见过一种方法可以旋转数字。我在一些网站上看到过这样的数字旋转,这就是我为什么问的原因……这并没有回答我的问题,我不想使用java API。我只是想用我自己的逻辑来更好地理解逐位运算符的工作原理。@AkshayaAmar我明白了,让我们先看看你真正想要的是什么,一旦我明白了哪一个是好的做法,我就会编辑答案。是移位数字还是移位位掩码,或者两者都是等效的?@AkshayaAmar我个人总是选择
leftShiftingMask
。事实上,我从来没有见过一种数字轮换的方法。我在一些网站上看到过这种数字轮换,这就是为什么我问…定义“更好”这个词?对你来说,在哪一方面应该被视为更好?永远不要旋转/移动你的数据,当它显然不需要时,只旋转/移动“位指针”
pos
@Eugene:我只想知道在移位数字和移位位掩码中,哪一个是好的做法?
leftShiftingMask
可能映射到并且是最常见的查看方式(在C中)。“最佳方式”取决于结果的使用方式。两者的
pos
应以
0
开头。定义“更好”一词?对你来说,在哪一方面应该被视为更好?永远不要旋转/移动你的数据,当它显然不需要时,只旋转/移动“位指针”
pos
@Eugene:我只想知道在移位数字和移位位掩码中,哪一个是好的做法?
leftShiftingMask
可能映射到并且是最常见的查看方式(在C中)。“最佳方式”取决于结果的使用方式。两者的
pos
应以
0
开头。
public static boolean rightShiftingNumber(int num, int pos){
    return ((num >> pos) & 1) != 0;
  }
public static boolean bitSetOrNot(int num, int pos){
   BitSet bitSet = BitSet.valueOf(new long[]{num});
   return bitSet.get(pos);
}