我有一个32位的bitset,我希望使用二进制加法方法为它添加1。所以我有一个二进制格式,现在我想以二进制样式添加1,是否有默认方法来完成它或者我必须为它创建一个函数。
group_id | array_agg
106 | {2147
| 2138
| 2144}
107 | {2132
| 2510
| 2139}
答案 0 :(得分:2)
std::bitset
可以从unsigned long
或unsigned long long
分配。
它还具有这些类型的访问器。
#include <bitset>
auto get() -> std::bitset<32>;
auto put(std::bitset<32>) -> void;
int main(){
auto bs = get();
bs = bs.to_ulong() + 1;
put(bs);
}
示例汇编程序输出:
main:
sub rsp, 8
call get()
lea edi, [rax+1]
call put(std::bitset<32ul>)
xor eax, eax
add rsp, 8
ret
请注意,编译器足够明亮,无需进行任何复制或转换。
答案 1 :(得分:2)
虽然答案本身很容易,但我会为一些好的编码风格建议做出贡献。
根据您显示的代码,您可以使用std::bitset::to_ulong()
,然后在转换回来之前添加或执行任何操作。
但是您的代码上几乎没有样式问题,而且可能会破坏未来架构的某些逻辑。
int
数据类型不保证为标准的32位。它保证代表整数类型,您正在编译的架构是最有效的。
uint32_t
是您所需要的,它保证在所有架构上都是32位长。
并且std::bitset
并不擅长它的工作。对于大于int
类型的大小,它根本不高效,因为需要进行索引,如果它低于int
类型,则效率不高于long
类型int类型。并且,通过使用它进行非按位操作的方法是将其转换为int
, 保证您的添加速度更快,甚至可以保持相同的速度这是uint32_t
。
因此,对于您的使用,最有效的类型肯定是 public function getVisitDelete($id){
$visits = Visit::find($id);
$visits->products()->detach();
$visits->delete();
}
,无符号保护它在签名类型按位操作时保护某些未定义的行为。
而且,在编写高效且可维护的代码时,您可以阅读:Why is "using namespace std" considered bad practice?