Побитовый оператор отрицания для ulong возвращает uint

Я хочу удалить последний установленный бит 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, Похоже, что поразрядно не преобразуется в uint или что-то еще.

Каков наилучший способ обойти это?

1 ответ

Решение

1U не является ulong, Это uint, декларировать test а также t как 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
Другие вопросы по тегам