小编Mar*_*rka的帖子

表示数字的最小位数

找出代表一些随机int数需要多少位的最有效方法是什么?例如,数字30,000表示二进制

111010100110000

所以它需要15位

c# integer bit-manipulation bit

4
推荐指数
2
解决办法
6751
查看次数

避免 bzhi(y, tzcnt(x)) 中不必要的 mov ecx, ecx 指令

我有一个位位置(它永远不会为零),通过使用 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++

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

DatabaseGeneratedOption.None公约

我想为我的所有实体手动插入id.是否可以创建某种约定,或者我必须为每个实体设置HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)(或添加DatabaseGenerated属性)?

编辑

有一种更简单的方法可以使用接受的答案:

modelBuilder.Conventions.Remove<StoreGeneratedIdentityKeyConvention>();
Run Code Online (Sandbox Code Playgroud)

entity-framework entity-framework-5

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