我正在寻找一个好的Java BitSet示例来使用0和1.我试着查看Javadocs,但是我只是通过阅读来了解该类的用法.例如,会如何and,or以及xor方法在两个不同的工作BitSet对象?
例如:
BitSet bits1 = new BitSet();
BitSet bits2 = new BitSet();
bits2.set(1000001);
bits1.set(1111111);
bits2.and(bits1);
System.out.println(bits2);
Run Code Online (Sandbox Code Playgroud)
如果我这样做,它返回bits2为空为什么是这样?
如果我有一个我想要执行位操作的整数,我该如何将其加载到java.util.BitSet?如何将其转换回int或long?我不太关心BitSet它的大小- 它总是32或64位长.我只是想使用set(),clear(),nextSetBit(),和nextClearBit()方法,而不是位运算符,但我无法找到一个简单的方法来初始化位以数字类型设置.
我最近向程序员提出了一个关于使用原始类型的手动位操作的原因的问题std::bitset.
从这个讨论中我得出结论,主要原因是它的表现相对较差,尽管我不知道这种观点有任何可靠的依据.接下来的问题是:
什么是对性能的影响,如果有的话,有可能通过将发生std::bitset在一个原始的位操作?
这个问题有意广泛,因为在网上看后我找不到任何东西,所以我会拿走我能得到的东西.基本上我是在std::bitset使用GCC,Clang和/或VC++在一些常见的机器架构上提供一些资源来提供对''bit-bitset'替代相同问题的资源.有一篇非常全面的论文试图回答这个问题的位向量:
http://www.cs.up.ac.za/cs/vpieterse/pub/PieterseEtAl_SAICSIT2010.pdf
不幸的是,它要么超出范围std::bitset,要么被认为超出范围,因此它专注于向量/动态数组实现.
我真的只是想知道是否std::bitset是更好的比使用情况下,它是为了解决方案.我已经知道它比一个整数上的比特更容易和更清晰,但它是否同样快?
我正在使用用户定义的位数(我持有三维位数组,因此大小立方增加 - 假设不小于512位),并且需要单独翻转它们.现在,只是在计算机上,我正在使用该bool类型,因为内存不是问题.我计划将来将代码移到微控制器上,因此处理能力和内存要求可能是一个问题.不过现在,我只想要速度.
然后我std::bitset从C++ STL中找到了该对象,但我无法在运行时定义bitset的大小.然后我发现std::vector<byte>有一个特殊的初始化器将它们存储为位(而不是整个字节,或4个字节),但随后在维基百科中找到了这一部分:
标准库定义了
vector模板的特化bool.此专业化的描述表明实现应该打包元素,以便每个bool只使用 一位内存.这被普遍认为是一个错误.[...] C++标准委员会和图书馆工作组之间存在普遍共识,vector<bool>应该弃用并随后从标准库中删除,而功能将以不同的名称重新引入.
现在,你可能会看到我想要使用一个vector<bool>对象,但在阅读之后,我正在考虑使用其他东西.唯一的问题是我不知道该使用什么.我很好奇为什么他们说应该重新引入功能(尽管名称不同).
所以,我的问题是,vector<bool>对象的使用是否可以接受(因为它们是STL的一部分)?它们是C++标准的一部分吗?
如果他们的使用是不可接受的,是否有一个可接受的替代解决方案(我自己定义一个特殊的容器)?我自己也有一些想法,但我很好奇是否有人有更好的解决方案.另外,我想避免使用大型库(同样,我希望最终将此代码移植到微控制器).
似乎std :: bitset没有STL迭代器.
因此,我不能做到以下几点:
std::bitset<8> bs;
for (auto it: bs) {
std::cout << "this can not be done out of the box\n";
}
Run Code Online (Sandbox Code Playgroud)
相反,我必须:
std::bitset<8> bs;
for (std::size_t i = 0; i < bs.size(); ++i) {
std::cout << bs[i] << '\n';
}
Run Code Online (Sandbox Code Playgroud)
没有迭代器,我也不能将bitset与任何STL算法一起使用.
为什么委员会决定从bitset中排除迭代器?
我想在C++中做一个bitset.我做了一些研究.我找到的所有例子都是这样的:
bitset<6> myBitset;
// do something with it
Run Code Online (Sandbox Code Playgroud)
但是当我在我的类中定义变量时,我不知道bitset的大小:
#include <bitset>
class Test
{
public:
std::bitset *myBitset;
}
Run Code Online (Sandbox Code Playgroud)
这不会编译......
像这样初始化也不起作用:
int size = getDependentSizeForBitset();
myBitset = new bitset<size>();
Run Code Online (Sandbox Code Playgroud) 我正在建立一个分析系统,API调用将提供唯一的用户ID,但它不是按顺序而且太稀疏.
我需要为每个唯一用户ID提供一个自动增量ID,以在bitarray/bitset中标记分析数据点.因此,第一个用户遇到的对应于比特阵列的第一个比特,第二个用户将是比特阵列中的第二个比特,等等.
那么在MongoDB中生成增量唯一用户ID有一种可靠而快速的方法吗?
有没有一种方法可以迭代(可能是巨大的)设置为true的位数std::bitset是线性的?我想防止必须检查bitset中的每个位置.迭代应该连续返回设置为true的每个位的索引.
我用a java.util.BitSet来存储密集的位向量.
我想实现一个将位向右移1的操作,类似于>>>on int.
有一个库函数可以改变BitSets吗?
如果没有,是否有比下面更好的方法?
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 …Run Code Online (Sandbox Code Playgroud)