Ответ 1
~0
- поразрядное дополнение к 0
, которое является числом со всеми заполненными битами. Для 32-битного int без знака это 0xffffffff
. Точное число f
будет зависеть от размера значения, которое вы присваиваете ~0
.
Какое значение ~ 0 в этом коде?
Может ли кто-нибудь проанализировать этот код для меня?
unsigned int Order(unsigned int maxPeriod = ~0) const
{
Point r = *this;
unsigned int n = 0;
while( r.x_ != 0 && r.y_ != 0 )
{
++n;
r += *this;
if ( n > maxPeriod ) break;
}
return n;
}
~0
- поразрядное дополнение к 0
, которое является числом со всеми заполненными битами. Для 32-битного int без знака это 0xffffffff
. Точное число f
будет зависеть от размера значения, которое вы присваиваете ~0
.
Это одно дополнение, которое инвертирует все биты.
~ 0101 => 1010
~ 0000 => 1111
~ 1111 => 0000
Как отмечали другие, оператор ~
выполняет побитовое дополнение. Однако результат выполнения операции над знаковым значением не определяется стандартом.
В частности, значение ~0
не обязательно должно быть -1
, что, вероятно, означает значение. Установка аргумента по умолчанию для
unsigned int maxPeriod = -1
сделал бы maxPeriod
содержать максимально возможное значение (подписанное беззнаковое преобразование определяется как присваивание по модулю 2**n
, где n
- характерное число заданного неподписанного типа (количество бит представления)).
Также обратите внимание, что аргументы по умолчанию недопустимы в C.
Это двоичная функция дополнения.
В основном это означает переворот каждого бита.
Это поразрядное дополнение к 0, которое в этом примере будет иметь int со всеми битами, установленными в 1. Если sizeof (int) равно 4, то число равно 0xffffffff.
В принципе, он говорит, что maxPeriod имеет значение по умолчанию UINT_MAX. Вместо того, чтобы писать его как UINT_MAX, автор использовал свои знания дополнений для вычисления значения.
Если вы хотите сделать код более читаемым в будущем, включите
#include <limits>
и измените вызов на чтение
unsigned int Order(unsigned int maxPeriod = UINT_MAX) const
Теперь, чтобы объяснить, почему ~ 0 является UINT_MAX. Поскольку мы имеем дело с int, в котором 0 представляется всеми нулевыми битами (00000000). Добавив одно, вы получите (00000001), добавив еще один (00000010), и еще один даст (00000011). Наконец, еще одно добавление даст (00000100), потому что 1 нести.
Для неподписанных целых чисел, если вы повторите процесс ad-infinum, в конце концов у вас есть все один бит (11111111), а добавление другого будет переполнять буфер, все биты вернутся к нулю. Это означает, что все одни биты в неподписанном номере - это максимум, который может содержать тип данных (int в вашем случае).
Операция "~" перевертывает все биты от 0 до 1 или от 1 до 0, перевернув нулевое целое число (которое имеет все нулевые биты), дает вам UINT_MAX. Таким образом, он в основном предыдущий кодированный выбрал компьютер UINT_MAX вместо использования системной копии, расположенной в #include <limits.h>
В примере это, вероятно, попытка сгенерировать значение UINT_MAX. Этот метод, возможно, ошибочен по причинам, уже изложенным.
Однако выражение имеет законное применение для создания битовой маски со всеми битами, заданными с использованием константы литерала, которая является независимой от ширины типа; но это не то, как он используется в вашем примере.
Как говорили другие, ~ - оператор побитового дополнения (иногда также называемый поразрядным). Это унарный оператор, который означает, что он принимает один вход.
Побитовые операторы обрабатывают входные данные как битовые шаблоны и выполняют свои соответствующие операции для каждого отдельного бита, а затем возвращают полученный шаблон. Применение оператора ~ к битовой схеме будет отрицать каждый бит (каждый нуль становится одним, каждый становится равным нулю).
В примере, который вы указали, битовое представление целого числа 0 - все нули. Таким образом, ~ 0 будет производить бит-шаблон всех. Несмотря на то, что 0 является int, это бит-шаблон ~ 0, который присваивается maxPeriod (а не значение int, которое будет представлено указанным битовым шаблоном). Поскольку maxPeriod является неподписанным int, ему присваивается значение unsigned int, представленное ~ 0 (шаблон всех), что на самом деле является наивысшим значением, которое unsigned int может хранить до обертывания назад до 0.