用于ulong的按位求反运算符返回uint

时间:2014-04-20 08:22:03

标签: c# bit-manipulation bitwise-operators ulong

我想删除ulong的最后一个位。这是我的所作所为:

ulong mydata;
...
ulong t = 1;
for (int i = 0; i < ulongSizeBits; i++)
{
    if ((myData&t)!=0)
    {
        mydata = mydata & (~t);
        break;
    }
    t <<= 1;
}

问题是这不像宣传的那样有效。让我们做另一个实验:

        var test = 1U;
        var t1 = ~test;
        var t = 1;
        for (int i = 0; i < 64; i++)
        {
            Console.Write((t&t1)!=0?1:0);
            t <<= 1;
        }

输出不是预期的01111111111111111111111111111111111111111111111111111111111111,而是0111111111111111111111111111111100000000000000000000000000000000。看来,按位不会将ulong转换为uint或其他东西。

解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

1U不是ulong。它是uint。将testt声明为ulong,即可获得所需内容:

var test = 1UL;
var t1 = ~test;
var t = 1UL;
for (int i = 0; i < 64; i++)
{
    Console.Write((t & t1) != 0 ? 1 : 0);
    t <<= 1;
}

打印

01111111111111111111111111111111111111111111111111111111111111