C#中的按位运算

Mig*_*uel 3 c# bit-manipulation

是否有更短更好看的替代品

(b == 0) ? 0 : 1;
Run Code Online (Sandbox Code Playgroud)

在按位运算方面?

另外,要获取a我正在使用的给定整数的正确符号(-1,0或1)

(a > 0) ? 1 : (a >> 32);
Run Code Online (Sandbox Code Playgroud)

有没有更短(但不慢)的方式?

Jon*_*eet 6

就个人而言,我坚持你的"等于或不等于"选项的第一个选项.

对于整数的符号,我将使用Math.Sign并假设JIT编译器将内联它 - 如果它被证明是一个潜在的瓶颈,则使用基准测试该假设.

首先考虑一下可读性 - 你的第一段代码非常明显.你的第二个不是.我甚至不相信你的第二段代码有效 ......我认为右移有效地被掩盖到底部的5位,假设这是一个Int32(int).

编辑:刚检查,确实你当前的第二段代码相当于:

int y = x > 0 ? 1 : x;
Run Code Online (Sandbox Code Playgroud)

转换甚至不会在编译的代码中结束.

将此作为关于微观优化而不是可读性的更多关注课程.如果易于理解 ,使代码工作要容易得多.如果你的代码给出错误的结果,我不关心它的运行速度.

  • @Miguel:参见C#4规范,第7.9节:"当`x`的类型是`int`或`uint`时,移位计数由`count`的低位五位给出.换句话说,移位计数由`count&0x1f'计算.具有讽刺意味的是,在规范的注释版本中,我有一个注释,正如下面所说:"掩盖移位计数我的效率很高,但它可能会造成一些非常混乱的行为." 看起来我在那个注释中是对的:) (2认同)