C#中的位移问题

时间:2014-12-02 21:01:39

标签: c# bit-manipulation xor bit-shift

private static byte xtime(byte Tm)
{
        int p = Convert.ToInt32(Tm);
        int p1 = (p >> 7);
        int p2 = (p1 & 1);
        int p3=(p2 * 0x1b);
        int p4 = (p << 1);
        int p5 = p4 ^ p3;

        byte p6 = (Convert.ToByte(p5));

        return p6;
}

当输出低于255时,此功能正常工作但否则会崩溃(溢出异常)。

例如如果Tm为163,则输出应为93 (我从使用unsigned char作为数据类型执行C lang中的相同代码获得此值)

有人可以建议一种让这个功能起作用的方法吗?

2 个答案:

答案 0 :(得分:1)

问题是p4将生成一个大于字节允许值的值。如果强制转换byte,它将截断更高的位:

var p4 = (byte)(p << 1);

答案 1 :(得分:1)

如果查看Convert.ToByte()文档,它产生的唯一例外实际上是

OverflowException导致

  

值小于Byte.MinValue或大于Byte.MaxValue。

代码中的

p5变为349

要解决此问题:

1)正如评论中提到的那样,对byte类型进行操作并且不将其转换为int

2)在适当的时候施放到(byte)。 cast truncates 并且不会生成异常。

所以你的最终代码可能看起来像这样(只是在没有对代码的语义进行争论的情况下进行处理):

    byte p1 = (byte)(Tm >> 7);
    byte p2 = (byte)(p1 & 1);
    byte p3=  (byte)(p2 * 0x1b);
    byte p4 = (byte)(Tm << 1);
    byte p5 = (byte)(p4 ^ p3);      
    byte p6 = p5;

p6 = 93根据需要。