繁体   English   中英

C#中的按位运算

[英]Bitwise operations in C#

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

(b == 0) ? 0 : 1;

在按位运算方面?

此外,以获得正确的符号(-1,0或1)给定的整数a我目前使用

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

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

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

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

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

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

int y = x > 0 ? 1 : x;

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

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

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

在按位操作方面......任何人都可以指出这一点吗? 另外,要获得我正在使用的给定整数的正确符号(-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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM