Что означает 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;
}

Ответы

Ответ 1

~0 - поразрядное дополнение к 0, которое является числом со всеми заполненными битами. Для 32-битного int без знака это 0xffffffff. Точное число f будет зависеть от размера значения, которое вы присваиваете ~0.

Ответ 2

Это одно дополнение, которое инвертирует все биты.

 ~  0101 => 1010
 ~  0000 => 1111
 ~  1111 => 0000

Ответ 3

Как отмечали другие, оператор ~ выполняет побитовое дополнение. Однако результат выполнения операции над знаковым значением не определяется стандартом.

В частности, значение ~0 не обязательно должно быть -1, что, вероятно, означает значение. Установка аргумента по умолчанию для

unsigned int maxPeriod = -1

сделал бы maxPeriod содержать максимально возможное значение (подписанное беззнаковое преобразование определяется как присваивание по модулю 2**n, где n - характерное число заданного неподписанного типа (количество бит представления)).

Также обратите внимание, что аргументы по умолчанию недопустимы в C.

Ответ 4

Это двоичная функция дополнения.

В основном это означает переворот каждого бита.

Ответ 5

Это поразрядное дополнение к 0, которое в этом примере будет иметь int со всеми битами, установленными в 1. Если sizeof (int) равно 4, то число равно 0xffffffff.

Ответ 6

В принципе, он говорит, что 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>

Ответ 7

В примере это, вероятно, попытка сгенерировать значение UINT_MAX. Этот метод, возможно, ошибочен по причинам, уже изложенным.

Однако выражение имеет законное применение для создания битовой маски со всеми битами, заданными с использованием константы литерала, которая является независимой от ширины типа; но это не то, как он используется в вашем примере.

Ответ 8

Как говорили другие, ~ - оператор побитового дополнения (иногда также называемый поразрядным). Это унарный оператор, который означает, что он принимает один вход.

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

В примере, который вы указали, битовое представление целого числа 0 - все нули. Таким образом, ~ 0 будет производить бит-шаблон всех. Несмотря на то, что 0 является int, это бит-шаблон ~ 0, который присваивается maxPeriod (а не значение int, которое будет представлено указанным битовым шаблоном). Поскольку maxPeriod является неподписанным int, ему присваивается значение unsigned int, представленное ~ 0 (шаблон всех), что на самом деле является наивысшим значением, которое unsigned int может хранить до обертывания назад до 0.