Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的位运算#_C#_Bit Manipulation - Fatal编程技术网

C# C语言中的位运算#

C# C语言中的位运算#,c#,bit-manipulation,C#,Bit Manipulation,是否有一个更短、更好看的替代方案 (b == 0) ? 0 : 1; 在按位操作方面 另外,为了获得给定整数a的正确符号(-1、0或1),我目前正在使用 (a > 0) ? 1 : (a >> 32); 有没有更短(但不是更慢)的方法?就我个人而言,我坚持第一个选项,即“等于零或不等于零”选项 对于整数的符号,我将使用并假设JIT编译器将内联它——如果它被证明是一个潜在的瓶颈,则使用基准测试该假设 首先考虑可读性——您的第一段代码是显而易见的。你的第二个不是。我甚至不相信你

是否有一个更短、更好看的替代方案

(b == 0) ? 0 : 1;
在按位操作方面

另外,为了获得给定整数
a
的正确符号(-1、0或1),我目前正在使用

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

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

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

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

首先考虑可读性——您的第一段代码是显而易见的。你的第二个不是。我甚至不相信你的第二段代码是有效的。。。假设这是一个
Int32
int

编辑:刚刚选中,您当前的第二段代码实际上相当于:

int y = x > 0 ? 1 : x;
这种转换甚至不会在编译后的代码中结束

将此作为一个实物课程,关注微观优化而非可读性。 如果代码易于理解,那么代码工作起来就容易多了。如果你的代码给出了错误的结果,我不在乎它运行得有多快。

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

在按位操作方面。。。可以 有人请把那个指给我看吗?也, 获取正确的符号(-1、0或1) 对于给定的整数a,我当前是 使用

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

第一个错误是,如果您有一个32位的带符号整数,并试图将其移位32,那么您将尝试查看第33位,在有符号基2 arthmetic的情况下,这将是一个溢出位

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

我应该补充一点,当你有一个带符号的整数时,零只有一个值。我想这是我对你的“检查符号”陈述的主要问题,你的陈述表明了对二进制数的误解


根据我的测试,
Math.Sign
比我使用的代码慢得多。但是,再一次,我希望答案是按位运算的,而不是备选方案,因为我正在学习!不管怎样,非常感谢。@Miguel:你能发布这些测试吗?有很多方法会使基准测试出错……您是否注意到
Int32.MaxValue>>32
返回0?这意味着它不限于前5位,因为这是一个32位的数字。@Miguel:嗯,我刚刚测试了和
Console.WriteLine(Int32.MaxValue>>32)打印2147483647。所以不,我就在这条战线上。(C#规范参考即将出台。)@Miguel:参见C#4规范第7.9节:“当
x
的类型为
int
uint
时,移位计数由
计数的低阶五位给出。换句话说,移位计数由'count&0x1f'计算。”。具有讽刺意味的是,在规范的注释版本中,我在下面有一个注释:“掩盖移位计数可能是有效的,但它会导致一些非常混乱的行为。”看起来我在注释中是对的:)@Miguel:真正接受微优化是邪恶的这一事实将比学习一些按位技巧更有用,相信我,你必须移动31,而不是32。如果您认为它比Math.Sign()快,那么就交换测试。
(a > 0) ? 1 : (a >> 32);