嗨我正在处理要求我访问特定/范围位的东西.我决定使用bitset,因为它很容易访问特定的位,但我能提取整个范围的位吗?
是否有任何特殊原因导致这些缺失?
它们确实存在BigInteger,但由于它们的不可变设计模式BigInteger通常非常慢.BitSet是好得多,因为它是可变的,但我真的很怀念shift功能(<<和>>>为longS).因为BitSet,就地移位也是有用的,以及循环旋转.
我已经看到了对Shifting a Java BitSet的回复(get(off, len)用于移位;但这需要复制).
别误会我的意思.我知道在哪里报告错误.我只是想知道是否有一个特别的理由要省略它们,例如一些设计模式或这样的概念.特别是因为它们被包括在内BigInteger.
我目前正在尝试在即时(JIT)编译器中实现各种算法.许多算法在位图上运行,通常称为位集.
在C++中,有多种方法可以实现bitset.作为一名真正的C++开发人员,我更喜欢使用STL中的东西.最重要的方面是表现.我不一定需要动态可调整大小的bitset.
我认为,有三种可能的选择.
I.一种选择是使用std::vector<bool>,它已针对空间进行了优化.这也表明数据不必在内存中连续.我想这可能会降低性能.另一方面,为每个bool值设置一位可以提高速度,因为它非常缓存友好.
II.另一种选择是使用a std::vector<char>.它保证数据在内存中是连续的,并且更容易访问单个元素.但是,使用此选项感觉很奇怪,因为它不是一个bitset.
III.第三种选择是使用实际的std::bitset.事实上它不能动态调整大小并不重要.
我应该选择哪一个以获得最佳性能?
在c ++中.我将bitset初始化为-3,如:
std::bitset<32> mybit(-3);
Run Code Online (Sandbox Code Playgroud)
是否存在转换mybit为的优雅方式-3.因为bitset对象只有像to_ulong和的方法to_string.
在java中,BitSet的内部数据存储为long []而不是int [],我想知道为什么?这是jdk中的代码:
/**
* The internal field corresponding to the serialField "bits".
*/
private long[] words;
Run Code Online (Sandbox Code Playgroud)
如果这完全取决于性能,我想知道为什么long []存储会获得更好的性能.
我想将字节数组的内容向左移12位.
例如,从这个类型的数组开始uint8_t shift[10]:
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xBC}
Run Code Online (Sandbox Code Playgroud)
我想将它向左移12位,结果是:
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAB, 0xC0, 0x00}
Run Code Online (Sandbox Code Playgroud) std::bitset有一种to_string()序列化为s和s 的char基于字符串的方法.显然,这对于bitset中的每个位使用单个8位,使得序列化表示比所需的长8倍.
我想将bitset存储在二进制表示中以节省空间.仅当我的bitset中少于32位时,该方法才有意义.我有几百个.
我不确定我是否想在对象(地址)本身上使用/ ,因为它假设对象是POD.10charto_ulong()memcpy()std::copy()
API似乎没有提供内部数组表示的句柄,我可以从中获取地址.
我还想选择从二进制表示中反序列化bitset.
我怎样才能做到这一点?
我想知道bitset实际上如何分配内存.我从一些博客中读到,它占用了内存.但是当我运行以下代码时:
bitset<3> bits = 001;
cout<<sizeof(bits);
Run Code Online (Sandbox Code Playgroud)
我得到输出为4.它背后的解释是什么?
还有一种在C++中以位为单位分配空间的方法吗?
我在数组上练习一个问题,我必须找到独特的元素.现在我的逻辑是找到数组中的max元素并为其定义bitset.但问题是bitset需要一个恒定的值,所以如何克服这个,下面是我的一些问题:
a)我可以用任何机会定义一个可变大小的bitset吗?
b)若没有,那么什么是用最好的方法vector<bool>还是vector<char>?
c)我知道boost有一个动态bitset,但是当我这样做学习时,我想知道其他方法.
我有这个应用程序,我应该BitSet大量使用类,并逐位写入文件.我知道我不能将位写入文件,所以首先我将BitSet对象转换为字节数组并写为字节数组.但问题是,因为BitSet类索引right to left,当我将BitSet对象转换为字节数组并写入文件时,它会向后写入.
例如,这是我的BitSet对象:
10100100
Run Code Online (Sandbox Code Playgroud)
和BitSet.get(0)给出false,BitSet.get(7)给出true.我想把它写成文件,如:
00100101
Run Code Online (Sandbox Code Playgroud)
所以第一位为0,最后一位为1.
我的转换方法:
public static byte[] toByteArray(BitSet bits)
{
byte[] bytes = new byte[(bits.length() + 7) / 8];
for (int i = 0; i < bits.length(); i++) {
if (bits.get(i)) {
bytes[bytes.length - i / 8 - 1] |= 1 << (i % 8);
}
}
return bytes;
}
Run Code Online (Sandbox Code Playgroud)
我的写法:
FileOutputStream fos = new FileOutputStream(filePath);
fos.write(BitOperations.toByteArray(cBitSet));
fos.close();
Run Code Online (Sandbox Code Playgroud)
这是打算像这样还是我做错了什么?谢谢.