找出代表一些随机int数需要多少位的最有效方法是什么?例如,数字30,000表示二进制
111010100110000
所以它需要15位
我有一个位位置(它永远不会为零),通过使用 tzcnt 计算得出,我想从该位置开始将高位归零。这是 C++ 和反汇编代码(我使用的是 MSVC):
auto position = _tzcnt_u64(xxx);
auto masked =_bzhi_u64(yyy, static_cast<uint32_t>(position));
Run Code Online (Sandbox Code Playgroud)
tzcnt rcx,rdx
mov ecx,ecx
bzhi rax,rbx,rcx
Run Code Online (Sandbox Code Playgroud)
BZHI 接受 unsigned int 作为第二个参数,但仅使用 rcx 中的位 [7..0],因此我认为这个“mov”指令是不必要的。
我用它来稍后计算 popcount,所以我也可以使用类似 <<(64-position) 的东西来代替。
问题是 - 这两个代码具有相同的执行时间,尽管 bzhi 应该比 sub+shlx 执行得更快,所以 mov 可能会产生差异。
有没有办法避免它或者这是编译器的事情?
c++ assembly bit-manipulation compiler-optimization visual-c++
我想为我的所有实体手动插入id.是否可以创建某种约定,或者我必须为每个实体设置HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)(或添加DatabaseGenerated属性)?
编辑
有一种更简单的方法可以使用接受的答案:
modelBuilder.Conventions.Remove<StoreGeneratedIdentityKeyConvention>();
Run Code Online (Sandbox Code Playgroud)