我有一个BitSet并希望将其写入文件 - 我遇到了使用writeObject方法使用ObjectOutputStream的解决方案.
我查看了java API中的ObjectOutputStream,看到你可以编写其他东西(byte,int,short等)
我试着检查一下这个类,所以我尝试使用以下代码将一个字节写入文件,但结果给了我一个7字节而不是1字节的文件
我的问题是文件中的前6个字节是什么?他们为什么在那里?
我的问题与BitSet有关,因为我不想开始将大量数据写入文件,并意识到我在文件中插入了随机字节而不知道它们是什么.
这是代码:
byte[] bt = new byte[]{'A'};
File outFile = new File("testOut.txt");
FileOutputStream fos = new FileOutputStream(outFile);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.write(bt);
oos.close();
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助
阿夫纳
实现按位的最佳方法是什么? memmove?该方法应该采用额外的目标和源位偏移,并且计数也应该是位.
_membitmove,它完全符合我的需要,但我找不到它的来源.isc_bitstring_copy,但效率不高我无法想象为什么选择std::bitset::size非静态的.这使得获得constexpr尺寸变得更加困难; 你必须写这样的东西:
template<int val>
struct int_
{
static const constexpr value = val;
};
template<size_t size>
auto getBitsetSizeIMPL(std::bitset<size>)
{
return int_<size>{};
}
template<typename BitsetType>
constexpr size_t getBitsetSize()
{
return decltype(getBitsetSizeIMPL(BitsetType{}))::value;
}
Run Code Online (Sandbox Code Playgroud)
如果它是静态的,你所要做的就是
BitsetType::size()
Run Code Online (Sandbox Code Playgroud)
并且不会牺牲功能.
是否有一个历史原因,我失踪或有一个我失踪的技术事实?
我在一个看起来像的文件中有一个二进制字符串
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100100101101100110000110100110110111000010100110110110110111000011001000010110010010001100010010001010010010100001011001100010100001100100011011101
(256位).我可以将此字符串设置为bitset<256>非常快的值吗?
目前我在做
for (int t = sizeof(c) - 1; t > 0; t--) {
if (c[t] == '1') {
b |= 1;
}
b <<= 1;
}
b >>= 1;
Run Code Online (Sandbox Code Playgroud)
但我的结果不正确.
对于SO来说这只是一点点OT,因为我不是要解决一个特定的问题,而只是为了理解某些事情的实现方式.但我是在代码之后,让我们看看它是怎么回事......
假设我们在一周中的每一天都有一个复选框,我们决定将这些复选框的任意组合存储为单个数字,这样:
0 = no days
1 = Monday
2 = Tuesday
4 = Wednesday
8 = Thursday
16 = Friday
32 = Saturday
64 = Sunday
127 = everyday
Run Code Online (Sandbox Code Playgroud)
如何在PHP中实现该逻辑,以便如果我提交说"13",PHP会知道只勾选周一,周三和周四复选框?
我试图XOR拖曳128位位组.
#include<iostream>
#include<bitset>
int main()
{
std::bitset<128> testing;
testing = std::bitset<128>(0x544F4E20776E69546F656E772020656F) ^
std::bitset<128>(0x5473206768204B20616D754674796E75);
std::cout<<testing;
}
Run Code Online (Sandbox Code Playgroud)
前64位为0,后64位为XOR.我也收到编译器警告
warning: integer constant is too large for its type
Run Code Online (Sandbox Code Playgroud)
有没有办法XOR 128位位集或我需要创建一个丑陋的黑客?
我正在处理C++中非常大的布尔列表,每个约有2 ^ N个N布尔项.因为内存在这种情况下是关键的,即指数增长,我想构建一个N位长变量来存储每个元素.
对于小N,例如24,我只是使用unsigned long int.需要64MB((2 ^ 24)*32/8/1024/1024).但我需要上升到36.内置的变量是唯一的选择unsigned long long int,但它需要512GB((2 ^ 36)*64/8 /一千○二十四分之一千○二十四/ 1024),这是一个有点过分.使用36位变量,它可以为我工作,因为大小下降到288GB((2 ^ 36)*36/8/1024/1024/1024),这适合我的超级计算机的节点.
我试过std::bitset,但std::bitset< N >创造了至少8B的元素.所以列表std::bitset< 1 >远远大于列表unsigned long int.这是因为std::bitset只是改变了表示,而不是容器.
我也尝试过boost::dynamic_bitset<>Boost,但结果甚至最差(至少32B!),出于同样的原因.
我知道一个选项是将所有元素写为一个布尔链,2473901162496(2 ^ 36*36),然后存储在38654705664(2473901162496/64)unsigned long long int,它给出288GB(38654705664*64/8/1024/1024/1024).然后访问元素只是找到存储36位的元素的游戏(可以是一个或两个).但是现有代码(3000行)的重写很多,因为映射变得不可能,并且因为在某些功能执行期间添加和删除项目肯定会复杂,混乱,具有挑战性,结果很可能效率不高.
如何在C++中构建一个N位变量?
我想找到位集中第一个设置位的索引。大多数现代 CPU 都可以利用 FFS 指令来加速正常大小的数字类型。当我想查找 C++ std::bitset 中的第一个设置位时,可以使用此指令吗?
int main(int argc, char const *argv[])
{
int x = 4;
int y = 2;
const int cell = x/y;
auto a = std::bitset<20>{cell}; //fails
auto b = std::bitset<20>(cell); //works
}
Run Code Online (Sandbox Code Playgroud)
为什么不允许std::bitset我在这里使用花括号构建,但可以使用括号构建?如果cell是 a constexpr,则两者都会编译。
编译错误:
test.cpp:21:29: error: non-constant-expression cannot be narrowed from type 'int' to 'unsigned long long' in initializer list [-Wc++11-narrowing]
auto a = std::bitset<20>{x*y}; //fails
^~~
test.cpp:21:29: note: insert an explicit cast to silence this issue
auto a = std::bitset<20>{x*y}; //fails
^~~
static_cast<unsigned …Run Code Online (Sandbox Code Playgroud) 有没有一种有效的方法来计算uint8_t缓冲区的按位和(假设缓冲区的数量<= 255,以便我们可以求和uint8)?基本上我想知道每个缓冲区的第 i 个位置设置了多少位。
例如:对于 2 个缓冲区
uint8 buf1[k] -> 0011 0001 ...
uint8 buf2[k] -> 0101 1000 ...
uint8 sum[k*8]-> 0 1 1 2 1 0 0 1...
Run Code Online (Sandbox Code Playgroud)
有没有 BLAS 或 boost 例程可以满足这样的要求?
在我看来,这是一个高度矢量化的操作。
更新:以下是需求的简单实现
uint8 buf1[k] -> 0011 0001 ...
uint8 buf2[k] -> 0101 1000 ...
uint8 sum[k*8]-> 0 1 1 2 1 0 0 1...
Run Code Online (Sandbox Code Playgroud)