标签: bitset

Java BitSet,允许简单地连接BitSet

我需要一个BitSet,它允许多个BitSet的轻松连接创建一个新的BitSet.该默认实现不具备这样的方法.

在某些外部库中是否有任何实现,任何人都知道哪个允许轻松连接?

例如,假设我有一个bitarray 11111和另一个位数组010101.我想要附加功能.因此连接后会产生11111010101.

java concat bitset

9
推荐指数
1
解决办法
3642
查看次数

为什么带有unsigned long long参数的std :: bitset构造函数未标记为显式?

标准库类模板std::bitset<N>有一个构造函数(C++ 11及更高版本,unsigned longC++ 11之前的参数)

constexpr bitset(unsigned long long) noexcept 
Run Code Online (Sandbox Code Playgroud)

与许多最佳实践指南相反,此单参数构造函数未标记为explicit.这背后的理由是什么?

c++ explicit-constructor unsigned-long-long-int bitset implicit-conversion

9
推荐指数
1
解决办法
2604
查看次数

有效地计算Set <Integer>的类似BitSet的实现的hashCode

我想知道,如何有效地计算hashCode类似BitSet的实现Set<Integer>.

BitSet#hashCode显然是快速地计算,而愚蠢的(*)和不兼容的Set#hashCode().

快速兼容的实现可能会像

int hashCode() {
    int result = 0;
    for (int i=0; i<bits.length; ++i) {
        long word = bits[i];
        result += 64 * i * Long.bitCount(word) + weightedBitCount(word);
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

如果有一个有效的实施

int weightedBitCount(long word) { // naive implementation
    int result = 0;
    for (int i=0; i<64; ++i) {
        if ((word & (1L << i)) != 0) {
            result += i;
        }
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

如果未设置大多数位,可以通过测试word==0 …

java hashcode bitset

9
推荐指数
2
解决办法
330
查看次数

连接boost :: dynamic_bitset或std :: bitset

连接2个位集的最佳方法是什么?

比如我有

boost::dynamic_bitset<> test1( std::string("1111") );
boost::dynamic_bitset<> test2( std::string("00") );
Run Code Online (Sandbox Code Playgroud)

它们应该连接成一个thrid Bitset test3然后保存

111100 
Run Code Online (Sandbox Code Playgroud)

解决方案应该使用boost :: dynamic_bitset.如果解决方案适用于std :: bitset,那也会很好.在连接位时应该关注性能.

更新:我比较了两种方法(来自我和Neil的字体方法以及来自信使的shift方法)和字符串方法更快(因子10 ++).代码在这里:http: //pastebin.com/HfpfYfy8

我希望Pastebin可以发布长代码清单.如果有更好的方法请与我联系.

c++ boost std bitset

8
推荐指数
2
解决办法
8186
查看次数

std :: bitset是否可以便携?

C++是否会对位排序做出任何说明?我特别致力于协议数据包布局,我怀疑是否有一种可移植的方式来指定将某个数字写入第5,6,7位,其中第5位是"最重要的".

我的问题:

  • 是0x01总是表示为第7位设置的字节?
  • bitset<8>().set(7).to_ulong()始终等于1?

c++ portability bitset

8
推荐指数
1
解决办法
1311
查看次数

如何将bitset转换为bytes/uint8数组?

我需要从bitset中取出字节,这可能(不)包含多个CHAR_BIT位.我现在需要将多少位中的位放入数组中.例如,

位集声明为 std::bitset < 40> id;

有一个单独的变量可以使用nBits多少位id.现在我想以CHAR_BIT的倍数提取这些位.我还需要处理案件nBits % CHAR_BIT != 0.我可以将它放入uint8数组中

c++ arrays bitset

8
推荐指数
2
解决办法
7123
查看次数

为什么std :: bitset以little-endian方式暴露位?

当我使用std::bitset<N>::bitset( unsigned long long )这个构造一个bitset时,当我通过它访问它时operator[],这些位似乎是以little-endian方式排序的.例:

std::bitset<4> b(3ULL);
std::cout << b[0] << b[1] << b[2] << b[3];
Run Code Online (Sandbox Code Playgroud)

打印1100而不是0011结尾(或LSB)位于小(低)地址,索引0.

它说,查找标准

将前M位位置初始化为相应的位值 val

程序员自然会想到从LSB到MSB的二进制数字(从右到左).所以前M位的位置可以理解为LSB→MSB,因此位0将为b[0].

然而,在转变中,定义是如此

E1<< 的值E2E1左移位E2位置; 空位是零填充的.

这里必须解释E1从MSB→LSB开始的位,然后是左移E2时间.如果它是从LSB→MSB写的,那么只有右移E2时间会产生相同的结果.

我很惊讶在C++的其他地方,语言似乎投射出自然(英语;从左到右)的写作顺序(当进行诸如移位之类的按位操作时).为什么在这里不一样?

c++ binary endianness bitset

8
推荐指数
2
解决办法
2795
查看次数

为什么std :: swap不能用于std :: bitset <n>内容?

考虑这个单元测试:

std::bitset<8> temp( "11010100" );
reverseBitSet( temp );
CPPUNIT_ASSERT( temp == std::bitset<8>( "00101011" ) );
Run Code Online (Sandbox Code Playgroud)

此实现有效:

template<size_t _Count> static inline void reverseBitSet( std::bitset<_Count>& bitset )
{
    bool val;
    for ( size_t pos = 0; pos < _Count/2; ++pos )
    {
        val = bitset[pos];
        bitset[pos] = bitset[_Count-pos-1];
        bitset[_Count-pos-1] = val;
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这个没有:

template<size_t _Count> static inline void reverseBitSet( std::bitset<_Count>& bitset )
{
    for ( size_t pos = 0; pos < _Count/2; ++pos )
    {
        std::swap( bitset[pos], bitset[_Count-pos-1] );
    }
} …
Run Code Online (Sandbox Code Playgroud)

c++ swap bitset c++11

8
推荐指数
1
解决办法
226
查看次数

使用按位AND和popcount而不是实际int或float的大(0,1)矩阵乘法?

对于乘法大二进制矩阵(10Kx20K),我通常要做的是将矩阵转换为浮点数并执行浮点矩阵乘法,因为整数矩阵乘法非常慢(请看这里).

但这一次,我需要执行超过数十万次这样的乘法运算,甚至平均事情上的毫秒级性能提升.


我想要一个intfloat矩阵作为结果,因为产品可能有非0或1的元素.输入矩阵元素都是0或1,因此它们可以存储为单个位.

在行向量和列向量之间的内积中(为了产生输出矩阵的一个元素),乘法简化为按位AND.添加仍然是添加,但我们可以添加具有填充计数功能的位,而不是单独循环它们.

一些其他布尔/二进制矩阵函数或位而不是计数它们,产生位矩阵结果,但这不是我需要的.


下面是一个示例代码,显示将问题形成为std::bitset, AND并且count操作比矩阵乘法更快.

#include <iostream>
using std::cout; using std::endl;
#include <vector>
    using std::vector;
#include <chrono>
#include <Eigen/Dense>
    using Eigen::Map; using Eigen::Matrix; using Eigen::MatrixXf;
#include <random>
    using std::random_device; using std::mt19937; using std::uniform_int_distribution;
#include <bitset>
    using std::bitset;

using std::floor;

const int NROW = 1000;
const int NCOL = 20000;

const float DENSITY = 0.4;
const float DENOMINATOR = 10.0 - (10*DENSITY);

void fill_random(vector<float>& vec) { …
Run Code Online (Sandbox Code Playgroud)

c++ sse avx bitset matrix-multiplication

8
推荐指数
1
解决办法
1145
查看次数

在Java中实现C风格的位域

我有一个问题,我有点困惑,一位同事告诉我,这将是一个寻求帮助的好地方.

我试图在Java中实现C风格的位域.这是一个粗略的例子(此时我没有在我面前的实际代码).

typedef union
{
  typedef struct
  {
     unsigned short a :1;
     unsigned short b :1;
     unsigned short c :2;
     unsigned short d :10;
  } bitfield;

  unsigned short bitmap;
}example_bitfield;
Run Code Online (Sandbox Code Playgroud)

遗留代码中我有一些类似的样式位域.我需要为Java提供等效方法的原因是我正在研究将使用Java与使用UDP的其他遗留应用程序进行通信的代码.

我没有重写代码的选项.我知道这种方法不可移植,有字节序问题(和填充/对齐等),如果我能够重写代码,可以做得更好.不幸的是,我需要回答这个非常具体的问题.系统已关闭,因此我不需要担心编译器/操作系统等每一种可能的组合.

使用Java EnumSet的方法不起作用,因为我认为只允许每个值为一位.我需要能够打包值,例如占用10位的d值.

我知道Java Bitset但它有局限性.我使用的是旧版本的Java,因此我没有一些较新的Java Bitset方法(即可能肯定有帮助的valueOf方法).

有没有人有任何关于如何使这个尽可能易于管理的想法?我有超过10个位域需要为我的通信实现.

感谢您提供任何帮助!

java bitset bit-fields

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