在C#中的位移中捕获掉落的字节

Rah*_*han 3 .net c# bit-manipulation

如果你想知道一个字节中是否设置了一个特定的位,一个简单的AND掩码可以做到这一点.我想知道是否有更快的方法来实现同样的目标.例如,位移<<或>>返回移位的数字而不是刚刚"掉落"的位.

如果托管代码中没有其他选择,那么编写不安全的程序集会使它更快吗?如果是这样,请解释如何.

上下文:这适用于需要针对生产代码进行高度优化的复杂算法.我认为有必要澄清这一点,以避免可怕的"做你自己的功课"评论和/或投票.

Mar*_*ell 6

要通过移位操作执行位测试,您必须将它(无符号)移位两次,以从任何一侧敲掉额外的位(您不需要将其放回任何特定位置 - 只测试零) .这很复杂而且不是最佳的.

奇怪的是,a &是执行位测试的标准方法,并且已经过大量优化; 这是一个单CPU指令,速度非常快.

&例如,只需使用测试if((x & MASK) != 0).

不,unsafe代码在这里不会真正帮到你.unsafe主要对指针感兴趣.指针很有趣,但你可以在没有指针的情况下进行完全相同的位测试.指针的一个潜在用途是,如果某种方式使用指针强制来一次测试更多数据,例如,如果你有一个byte[],但你想一次测试8个字节,强迫byte[]a到a byte*,然后byte*到a long*ulong*.这可能是一个有用的优化,例如,web-socket masking(使用更宽的xor掩码对字节流进行操作).但是,对于简单的位测试,这些都不是必需的.