Побитовый оператор отрицания для 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