我正在使用A java.util.BitSet
存储密集的位向量。
我想实现一个将位右移1的操作,类似于>>>
on ints。
是否存在可将BitSet
s 移位的库函数?
如果没有,还有没有比下面更好的方法了?
public static void logicalRightShift(BitSet bs) {
for (int i = 0; (i = bs.nextSetBit(i)) >= 0;) {
// i is the first bit in a run of set bits.
// Set any bit to the left of the run.
if (i != 0) { bs.set(i - 1); }
// Now i is the index of the bit after the end of the run.
i = bs.nextClearBit(i); // nextClearBit never returns -1.
// Clear the last bit of the run.
bs.clear(i - 1);
// 0000111100000...
// a b
// i starts off the loop at a, and ends the loop at b.
// The mutations change the run to
// 0001111000000...
}
}
这应该够了吧:
BitSet shifted = bs.get(1, bs.length());
它会为您提供与原始位相同的位集,但没有最低位。
编辑:
为了概括这一点n
,
BitSet shifted = bs.get(n, Math.max(n, bs.length()));
我目前正在学习位操作,我的任务是做一个左旋转的4位整数。 我的4位左旋转代码是 我想做一个4位循环移位,以保持作为一个4位后旋转,但似乎不能理解它是如何工作的。 例如:10(1010)左旋转1位后给出5(0101),但它给出的值是21,比我的4位多。 任何能让我理解这个问题的帮助都将不胜感激!
问题内容: 当遇到按位移位运算符时,我遇到了一个有趣的场景。如果第二个操作数为负,按位移位运算如何工作?。 即,<< << b,“ <<”将a中的位模式向左移动b位。但是,如果b为负数,在运行时是否应该出错? 我能够成功运行以下代码,但我不知道它是如何工作的? 输入项 结果 “ a”的ASCII码为97。有人可以帮助我了解其工作原理吗? 问题答案: 但是,如果b为负数,在运行时是否应该出错? 不符
我必须编写一个函数,对y位置的位进行左循环移位。例如,如果我将:01011000和2作为y,则函数必须返回011000001。 我已经尝试使用但它似乎是无用的。
问题内容: 我希望我的位图具有屏幕的高度,并且具有比屏幕大的宽度,如果用户更改桌面,则可以向右或向左或向左移动一点,以便他可以看到整个图像。 这是我的代码,仅部分起作用: 谢谢! 问题答案: 您可以通过onOffsetsChanged()中的变量xPixels和yPixels获得准确的像素值。在这里查看我的答案:android动态壁纸缩放 例如,在onOffsetsChanged()中,您可以设置
问题内容: 我要感谢一个很好的教程,该教程为Java新手解释了Java中所有“移位”如何工作。 我总是偶然发现它,但从未理解它是如何工作的。它应该解释Java中字节移位/位操作可能实现的所有操作和概念。 这只是我意思的一个示例(但我正在寻找一个讲解每种可能操作的教程): 问题答案: 好吧,官方Java教程“ 按位和位移位运算符”介绍了Java中可用的实际操作以及如何调用它们。 如果您想知道“我该如
问题内容: 我确定这对任何人来说都是一件容易的事! 为什么在Java中代码像 打印 这对我来说没有意义。是一个64位数字-而它看起来像上面的一个。我知道bitshifted s会进行int提升,但是在这种情况下我看不到发生了什么。 任何关于这里发生的事情的指针都将是很好的:) 谢谢 编辑 :感谢所有的答案-单击“提交”后,我意识到发生了什么,但是进入了模式,我无法删除!非常感谢! 问题答案: 这是