2017-01-30 21 views
0

Мне интересно, как вы берете число (например, 9), конвертируете его в 32 int (00000000000000000000000000001001), а затем инвертируете каждый бит (1111111111111111111111111111110110). Я знаю, как это сделать, заменив числа в строке, но мне нужно знать, как это сделать с бинарными операторами. Я думаю, вы должны использовать это, «~», но это просто дает мне отрицательное число, когда я использую его для значения.Инвертирование всех 32 битов в число с использованием двоичных операторов в C#

+1

использования неподписанных Int. –

+9

'11111111111111111111111111110110' как' int' *** *** - отрицательное число; '~ val' правильный; если вы не хотите его подписывать, используйте 'uint' –

ответ

0

Если вы посмотрите на десятичную версию своего номера, то это отрицательное число. Если вы объявите его как unsigned int, то это положительный. Но это не имеет значения, двоичное всегда будет 11111111111111111111111111110110. Попробуйте это:

int number = 9; 
Console.WriteLine(Convert.ToString(number, 2)); //Gives you 1001 
number = ~number;        //Invert all bits 
Console.WriteLine(Convert.ToString(number, 2)); 
//Gives you your wanted result: 11111111111111111111111111110110 
2

Это правильная функциональность. Тип данных int внутри C# использует целые числа со знаком, поэтому 1111111111111111111111111111110110 фактически является отрицательным числом.

Как указал Марк, если вы хотите использовать значения без знака, объявите свой номер как uint.

+3

, это не правда (или, по крайней мере: полный), чтобы сказать:« C# использует целые числа со знаком »; более корректно, C# позволяет легко использовать либо подписанные ('sbyte',' short', 'int',' long'), либо неподписанные ('byte',' ushort', 'uint',' ulong') целые числа –

+0

@MarcGravell Правда, я имел в виду int. – Peter