Какова цель & quot; int mask = ~ 0; & quot ;?

Я видел следующую строку кода Вот в С.

 int mask = ~0;

Я напечатал значение mask в C и C ++. Всегда печатает -1,

Итак, у меня есть несколько вопросов:

  • Зачем присваивать значение ~0 к маскировать переменная?
  • Какова цель ~0?
  • Можем ли мы использовать -1 вместо ~0?

44

Решение

Это портативный способ установить все двоичные биты в целых числах в 1 бит без необходимости знать, сколько битов в целом числе в текущей архитектуре.

78

Другие решения

C и C ++ допускают 3 различных целочисленных формата со знаком: величина знака, дополнение к одному и дополнение к двум

~0 будет производить все-один бит независимо от формата знака система использует. Так что это более портативный чем -1

Вы можете добавить U суффикс (т.е. -1U) для генерации единой битовой комбинации переносимый1. тем не мение ~0 указывает на более четкое намерение: инвертировать все биты в значении 0, тогда как -1 покажет, что необходимо значение минус один, а не его двоичное представление

1 потому что операции без знака всегда уменьшено по модулю число, которое на единицу больше наибольшего значения, которое может быть представлено результирующим типом

37

Это на платформе дополнения 2 (что предполагается) дает вам -1, но запись -1 напрямую запрещена правилами (только целые числа 0..255, унарные !, ~ и двоичный &, ^, |, +, << а также >> разрешены).

8

Вы изучаете проблему кодирования с рядом ограничений на операторы и языковые конструкции для выполнения заданных задач.

Первая проблема вернуть значение -1 без использования - оператор.

На машинах, которые представляют отрицательные числа с дополнением до двух, значение -1 представлен со всеми битами, установленными в 1, так ~0 оценивает -1:

/*
* minusOne - return a value of -1
*   Legal ops: ! ~ & ^ | + << >>
*   Max ops: 2
*   Rating: 1
*/
int minusOne(void) {
// ~0 = 111...111 = -1
return ~0;
}

Другие проблемы в файле не всегда реализованы правильно. Вторая проблема, возвращая логическое значение, представляющее факт int значение будет соответствовать 16-битной подписи short имеет недостаток:

/*
* fitsShort - return 1 if x can be represented as a
*   16-bit, two's complement integer.
*   Examples: fitsShort(33000) = 0, fitsShort(-32768) = 1
*   Legal ops: ! ~ & ^ | + << >>
*   Max ops: 8
*   Rating: 1
*/
int fitsShort(int x) {
/*
* after left shift 16 and right shift 16, the left 16 of x is 00000..00 or 111...1111
* so after shift, if x remains the same, then it means that x can be represent as 16-bit
*/
return !(((x << 16) >> 16) ^ x);
}

Сдвиг влево отрицательного значения или числа, значение которого сдвинуто за пределы диапазона int имеет неопределенное поведение, смещение вправо отрицательного значения определяется реализацией, поэтому приведенное выше решение неверно (хотя, вероятно, это ожидаемое решение).

5

Давным-давно так вы экономили память на крайне ограниченном оборудовании, таком как компьютер 1K ZX 80 или ZX 81. В бейсике вы бы

Let X = NOT PI

скорее, чем

LET X = 0

Поскольку числа хранились как 4-байтовые числа с плавающей запятой, последняя занимает на 2 байта больше, чем первая альтернатива NOT PI, где каждый из NOT и PI занимает один байт.

2

Существует несколько способов кодирования чисел во всех компьютерных архитектурах. При использовании дополнения 2 это всегда будет верно:~0 == -1, С другой стороны, некоторые компьютеры используют дополнение 1 для кодирования отрицательных чисел, для которых приведенный выше пример не соответствует действительности, поскольку ~0 == -0, Да, 1-е дополнение имеет отрицательный ноль, и поэтому оно не очень интуитивно понятно.

Так что на ваши вопросы

  • ~ 0 назначен маске, поэтому все биты в маске равны 1 -> создание mask & sth == sth
  • ~ 0 используется, чтобы сделать все биты равными 1 независимо от используемой платформы
  • вы можете использовать -1 вместо ~ 0, если вы уверены, что ваша компьютерная платформа использует кодировку числа дополнения 2

Моя личная мысль — сделать ваш код как можно более независимым от платформы. Стоимость относительно мала, и код становится отказоустойчивым

0
По вопросам рекламы [email protected]