C#中的按位运算

时间:2011-02-23 14:10:38

标签: c# bit-manipulation

是否有更短更好看的替代

(b == 0) ? 0 : 1;

按位运算?

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

(a > 0) ? 1 : (a >> 32);

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

3 个答案:

答案 0 :(得分:6)

就我个人而言,我坚持使用“等于零或不等于”选项的第一个选项。

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

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

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

int

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

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

答案 1 :(得分:4)

微观优化是万恶之源 。你牺牲了一纳秒的可读性。这是一个糟糕的讨价还价

答案 2 :(得分:1)

  

在按位运算方面......可以   有人请指点给我吗?也,   得到正确的符号(-1,0或1)   我目前给定的整数   使用

(a > 0) ? 1 : (a >> 32); 

Armen Tsirunyan和Jon Skeet回答了您的技术问题,我将尝试解释您似乎遇到的一些技术误解。

第一个错误是,如果你有一个32位有符号整数并试图将其移位32,你将试图查看第33位,在有符号基数2关节的情况下,它将是溢出位。

第二个错误是你有32位带符号的二进制值。最后一位可以是1或0。只有一个零值。因此,您试图弄清楚该符号是否为(-1,0,1)的陈述清楚地表明您不理解这一事实。如果有符号位为1,则数字为负数,如果为零,则为正数。在.NET Framework中处理大部分数字的结构不知道2的补码和1的补码。这当然并不意味着您无法扩展该功能或只是将有符号整数转换为2的补码(真的很简单)。

我应该补充一点,当你有一个有符号整数时,只有一个值为零。我想这是我的主要问题,你所做的“检查签名”声明显示了对二进制数字的误解。

http://en.wikipedia.org/wiki/Signed_magnitude#Sign-and-magnitude