我正在将一些 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)
有没有更好的办法?
当我编写以下程序时,它可以正常工作,即在 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)
不起作用并抛出堆栈溢出异常

如何在java中的bitSet中输入整数的二进制表达式?
说a = 15我想放入1111一个bitSet,
有这个功能吗?
我有一个使用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)
有没有更好的办法?
有没有办法使用 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,或者有没有一种我不知道的方法可以做到这一点?
我有两个浮点(32 位)和双(64 位)的 IEEE754 二进制表示位集。如何将此位集转换为真正的浮点数或双数?
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)
我找不到这方面的错误报告。这是已知的或有记录的吗?
我无法弄清楚我在这里做错了什么,希望有人在这里可以启发我.
我有一个类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) 我的要求很简单:
是否有ac#等效,它提供与BitSetJava 类似的功能?
这是场景:
更新: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) 有没有比使用for循环更好(更快/更有效)的方法在大内存块上执行按位操作?在查看选项后,我注意到std有一个成员std::bitset,并且还想知道在不更改其值的情况下将大区域内存转换为bitset会更好(甚至可能),然后执行操作,然后切换它的类型恢复正常?
编辑/更新:我认为union这里可能适用,这样内存块被分配了一个或多个new数组,int然后被操作为一个大的bitset.根据这里所说的内容,似乎可以在整个集合中完成操作:http://www.cplusplus.com/reference/bitset/bitset/operators/.