标签: bitset

将BitSet写入java中的文件

我有一个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)

谢谢你的帮助

阿夫纳

java objectoutputstream bitset

7
推荐指数
1
解决办法
5830
查看次数

Bitwise memmove

实现按位的最佳方法是什么? memmove?该方法应该采用额外的目标和源位偏移,并且计数也应该是位.

  • 我看到ARM提供了非标准的 _membitmove,它完全符合我的需要,但我找不到它的来源.
  • Bind的bitset包括 isc_bitstring_copy,但效率不高
  • 我知道C标准库没有提供这样的方法,但我也找不到提供类似方法的任何第三方代码.

c bit-manipulation bitset memmove

7
推荐指数
1
解决办法
782
查看次数

为什么std :: bitset :: size是非静态的

我无法想象为什么选择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)

并且不会牺牲功能.

是否有一个历史原因,我失踪或有一个我失踪的技术事实?

c++ std bitset c++11

7
推荐指数
1
解决办法
410
查看次数

如何从二进制字符串创建位集?

我在一个看起来像的文件中有一个二进制字符串

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)

但我的结果不正确.

c++ char bitset

6
推荐指数
1
解决办法
8920
查看次数

使用bitcode

对于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会知道只勾选周一,周三和周四复选框?

php bitset

6
推荐指数
2
解决办法
414
查看次数

XOR 128位位组

我试图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++ bitset

6
推荐指数
1
解决办法
762
查看次数

如何在C++中构建N位变量?

我正在处理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位变量?

c++ algorithm optimization bitarray bitset

6
推荐指数
1
解决办法
380
查看次数

std::bitset 是否有等效的 ffs() ?

我想找到位集中第一个设置位的索引。大多数现代 CPU 都可以利用 FFS 指令来加速正常大小的数字类型。当我想查找 C++ std::bitset 中的第一个设置位时,可以使用此指令吗?

c++ bit-manipulation bitset

6
推荐指数
1
解决办法
854
查看次数

初始化列表中的非常量表达式不能从类型“int”缩小为“unsigned long long”

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)

c++ constructor bitset

6
推荐指数
1
解决办法
2万
查看次数

高效的按位求和计算

有没有一种有效的方法来计算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)

c c++ algorithm blas bitset

6
推荐指数
1
解决办法
377
查看次数