标签: bitset

如何在 C++ 中进行 SystemVerilog 风格的位向量切片分配?

我正在将一些 SystemVerilog 代码移植到 SystemC/C++。我使用 std::bitset 来表示位向量,但我已经看到它无法提供访问切片的方法。

例如,如果我想使用 SystemVerilog 代码将 reg1 设置为 reg2 的位 4-8:

bit [3:0] reg1;
bit [15:0] reg2;
reg1 = reg2[7:4];
Run Code Online (Sandbox Code Playgroud)

我怎样才能用 std::bitset 做到这一点?

bitset<4> reg1;
bitset<16> reg2;
reg1[0] = reg2[4];
reg1[1] = reg2[5];
reg1[2] = reg2[6];
reg1[3] = reg2[7];
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

c++ system-verilog bitset

4
推荐指数
1
解决办法
2044
查看次数

C++ 全局和非全局数组的区别(Stackoverflow Exception)

当我编写以下程序时,它可以正常工作,即在 main() 方法之外声明了 bitset 数组。

正确工作

#include <iostream>
#include <bitset>

using namespace std;

bitset<5000> set[5000];

int main(){
    cout<<"program runs fine"<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是当我在 main 方法中创建它时,我得到了堆栈溢出异常。谁能详细解释一下这里发生了什么?通常我会在递归方法中看到堆栈溢出异常。那么谁在这里使用堆栈?

#include <iostream>
#include <bitset>

using namespace std;


int main(){
    bitset<5000> set[5000];
    cout<<"program runs fine"<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

不起作用并抛出堆栈溢出异常 在此处输入图片说明

c++ stack-overflow arrays out-of-memory bitset

4
推荐指数
1
解决办法
1504
查看次数

如何将整数的二进制表达式输入到java中的bitSet中

如何在java中的bitSet中输入整数的二进制表达式?

a = 15我想放入1111一个bitSet,

有这个功能吗?

java binary bitset

4
推荐指数
1
解决办法
4305
查看次数

在Scala中将BitSet设置为[Int]或反之亦然

我有一个使用BitSet的库,我需要更改Set [Int]类型数据才能使用该库.

我想到的是使用.toSeq:_*操作,但我不确定这是从BitSet转换为Set [Int]还是反过来的有效方法.

scala> BitSet(Set(1,2,3).toSeq:_*)
res55: scala.collection.immutable.BitSet = BitSet(1, 2, 3)

scala> Set(BitSet(1,2,3).toSeq:_*)
res56: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

scala set bitset

4
推荐指数
1
解决办法
619
查看次数

使用带有位集的initializer_list

有没有办法使用 aninitializer_list来构造 a bitset

例如我想做:

const auto msb = false;
const auto b = true;
const auto lsb = false;
const bitset<3> foo = {msb, b, lsb};
Run Code Online (Sandbox Code Playgroud)

但是当我尝试这个时我得到:

错误:无法{msb, b, lsb}从“<大括号封闭的初始值设定项列表>”转换为const std::bitset<3u>

我是否必须使用转变来构造一个unsigned long来初始化foo,或者有没有一种我不知道的方法可以做到这一点?

c++ boolean bit-shift bitset initializer-list

4
推荐指数
1
解决办法
1526
查看次数

位集浮点或双值 C++

我有两个浮点(32 位)和双(64 位)的 IEEE754 二进制表示位集。如何将此位集转换为真正的浮点数或双数?

c++ floating-point bitset

4
推荐指数
1
解决办法
1033
查看次数

BitSet.size() 返回负值。已知错误?

new BitSet(Integer.MAX_VALUE).size()报告负值:

import java.util.BitSet;

public class NegativeBitSetSize {
    public static void main(String[] args) {
        BitSet a;

        a = new BitSet(Integer.MAX_VALUE);
        System.out.println(a.size()); // -2147483648

        a = new BitSet(Integer.MAX_VALUE - 50);
        System.out.println(a.size()); // -2147483648

        a = new BitSet(Integer.MAX_VALUE - 62);
        System.out.println(a.size()); // -2147483648

        a = new BitSet(Integer.MAX_VALUE - 63);
        System.out.println(a.size()); // 2147483584
    }
}
Run Code Online (Sandbox Code Playgroud)

在测试系统上:

$ java -version
openjdk version "11.0.14" 2022-01-18
OpenJDK Runtime Environment (build 11.0.14+9-Ubuntu-0ubuntu2.18.04)
OpenJDK 64-Bit Server VM (build 11.0.14+9-Ubuntu-0ubuntu2.18.04, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)

我找不到这方面的错误报告。这是已知的或有记录的吗?

java debugging bitset

4
推荐指数
1
解决办法
216
查看次数

使用VS2010的C++中的位集

我无法弄清楚我在这里做错了什么,希望有人在这里可以启发我.

我有一个类Flags,这是一个非常简化的版本,但我声明了一个bitset

class Flags
{
private:
    //List of 8 bits
    std::bitset<8> _P;
public:
    Flags();
}
Run Code Online (Sandbox Code Playgroud)

在我的构造函数上,我将其初始化为

Flags::Flags()
    : _P(32ul)
{}
Run Code Online (Sandbox Code Playgroud)

但它不会编译并给我错误

错误C2668:'std :: bitset <_Bits> :: bitset':对重载函数的模糊调用

这是在VS2010 SP1 64位编译但作为32位程序

编辑

接受的答案是针对上述情况,但作为旁注,任何人都可以解释为什么当使用默认构造函数(它应该将它们全部初始化为零)时,它们并不都设置为零?

_p.to_ulong()
Run Code Online (Sandbox Code Playgroud)

返回1390560944,_p看起来像

[8](0,0,0,0,1,1,0,1)
Run Code Online (Sandbox Code Playgroud)

c++ visual-studio-2010 bitset

3
推荐指数
1
解决办法
1775
查看次数

什么是Java的BitSet的C#等价物?

我的要求很简单:

  1. 能够定义位数组的维度,即:5个字节.
  2. bool Get(bitIndex:int)
  3. 设置(bitIndex:int)

是否有ac#等效,它提供与BitSetJava 类似的功能?

这是场景:

  1. 初始化5个字节,所有位都为0(假).
  2. 将字节3,位8设置为TRUE.
  3. 获取字节3,位8的状态.

更新:Michael Bray的解决方案:

static void Main(string[] args) 
{ 
  // Set for 5 bytes 
  BitArray ba = new BitArray(8 * 5); 

  // Set bit #1 on byte #4 
  ba.Set(GetBitNum(4, 1), true); 

  // Get bit #1 on byte #4 
  bool v = ba.Get(GetBitNum(4, 1)); 
} 

static int GetBitNum(int byteNum, int bitNum)   // Assumes index starts at 1 
{ 
  return (byteNum - 1) * 8 + (bitNum - 1); 
}
Run Code Online (Sandbox Code Playgroud)

c# java bitset

3
推荐指数
1
解决办法
5590
查看次数

如何对内存块进行按位操作(C++)

有没有比使用for循环更好(更快/更有效)的方法在大内存块上执行按位操作?在查看选项后,我注意到std有一个成员std::bitset,并且还想知道在不更改其值的情况下将大区域内存转换为bitset会更好(甚至可能),然后执行操作,然后切换它的类型恢复正常?

编辑/更新:我认为union这里可能适用,这样内存块被分配了一个或多个new数组,int然后被操作为一个大的bitset.根据这里所说的内容,似乎可以在整个集合中完成操作:http://www.cplusplus.com/reference/bitset/bitset/operators/.

c++ memory bit-manipulation bitwise-operators bitset

3
推荐指数
1
解决办法
3703
查看次数