有没有一种简单的方法来获取 std::bitset <N>的 2 补码
Is there a trivial way to get the 2's complement of an std::bitset<N>
我在程序中使用了std::bitset<N>
,需要找到最不重要的设置位,并进行了如下简单计算:
int num = 5;
int res = num & (-num);
之后,最低有效位num
设置为res
,其余部分都0
。这就像-5
用 2 的补码表示法表示一样工作。
但我发现std::bitset<N>
对一元operator -
没有任何运算符重载,这将为我提供底层位的 2 补充。有没有一种简单的方法可以用std::bitset<N>
实现 2 的补码?我总是可以使用operator ~
来翻转位并在它们上循环,从 LSB 到 MSB 开始求和和携带,但我正在寻找一种可以避免这种情况的解决方案。
std::bitset
不提供任何补码方法。由于您必须自己计算补码operator~
和额外的循环,因此只需跳过operator~()
并直接搜索LSB:
template <int N>
size_t least_significant_bit(const std::bitset<N> &bt){
for(size_t i = 0; i < bt.size(); ++i){
if(bt.test(i))
return i;
}
}
我想没有比这;)更微不足道
的了。请注意,如果根本没有位,则不会指定least_significant_bit
的结果。可以返回N
或更改循环以测试会引发异常bt.test(N)
,但毕竟在空位集中查找 LSB 并没有真正的意义。
另请注意,如果您对边界检查不感兴趣,可以使用std::bitset<N>::operator[]
而不是std::bitset<N>::test
。
除非我错过了什么,否则应该这样做
std::bitset<N> twos_comp = std::bitset<N>((~input).to_ulong() + 1);
执行二进制补码的一种非常方便的方法是在位集中找到最不重要的 0,将其设置为 1 并将所有不太重要的位设置为 0。
伪代码:(假设 set[0] 是最不重要的位,如果不是,则将其扭转(
int i = 0;
while (i < set.length && set[i])
{
set[i] = 0;
++i;
}
if (i < set.length)
set[i] = 1;
相关文章:
- 如何打印大于"无符号长长"的"std::bitset"的十进制值?
- 关于 std::bitset 构造函数的几个问题?
- 如何以滑动窗口方式从 std::bitset 读取位并将它们转换为 int?
- 在哪里可以找到 std::bitset 的数据成员?
- 检查两个图是否为补码的功能
- 反转 18 位 int 的二进制补码
- 对于std::bitset,是否有一个ffs()等价物
- 移动 std::bitset<N> 是否超过 N 个位置未定义的行为?
- 是否可以让 Bitset 将位打印到一行?
- 找不到使用 bitset 实例化模板函数的有效方法
- 我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset
- OMNeT++ cPacket as std::bitset 以应用 Reed-Solomon 编码
- 需要二人补码的 C++20 的后果
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 初始化一对(bitset,int)的向量
- 将字符数组转换为 std::string 以传递到 std::bitset seg 错误
- std::bitset 哈希函数算法
- 在计算负数的二进制补码时如何实现"+1"加法
- 与STD :: BITSET的工会成员的结构填充
- 有没有一种简单的方法来获取 std::bitset <N>的 2 补码