Что означает ~ на С++?
В частности, не могли бы вы рассказать мне, что делает эта строка кода:
int var1 = (var2 + 7) & ~7;
Спасибо
Ответы
Ответ 1
Это побитовое отрицание. Это означает, что он выполняет двоичный оператор NOT на каждом бите числа. Например:
int x = 15; // Binary: 00000000 00000000 00000000 00001111
int y = ~x; // Binary: 11111111 11111111 11111111 11110000
В сочетании с оператором и используется для очистки бит. Итак, в вашем примере это означает, что последние 3 бита результата var2+7
установлены в нули.
Как отмечено в комментариях, он также используется для обозначения деструкторов, но это не так в вашем примере.
Ответ 2
Этот код округляет var1 до ближайшего номера n * 8. и ~ 7 устанавливает последние 3 бита в 0, округляя до 8 * n.
Ответ 3
Это побитовое НЕ. Не путать с логическим не (который есть!), Который переворачивает логическое значение (true для false и наоборот). Этот оператор переворачивает каждый бит в переменной.
Ответ 4
7 в двоичном формате - 00000111, поэтому ~ 7 равно 11111000 (в предположении 8-разрядного байта). Автор кода использует его для маскировки бит.
Ответ 5
Эффект кода, как отмечено, заключается в округлении значения до следующего более высокого кратного восьми. Моя предпочтительная формулировка будет "var1 = (var2 | 7) +1;" но чтобы понять выражение как написанное, наиболее полезно понять его извне.
Хотя "&" и "~" - это отдельные операторы с разными правилами определения приоритетов, понятие "a = b и ~ c;" является полезной, которая в очень реальном смысле заслуживает своего собственного оператора (это позволило бы, среди прочего, более разумные целые правила продвижения по службе). В принципе, "a = b и ~ c;" служит для отмены любых бит в 'b', которые также находятся в 'c' (если 'b' длинный, а 'c' - нет, из-за целых правил продвижения, это также отменяет более высокие бит). Если 'c' равно 2 ^ N-1, выражение будет отменять нижние N бит, что эквивалентно округлению до следующего кратного 2 ^ N.
Выражение в виде записи добавляет 7 к var2 перед округлением результата до следующего кратного 8. Если var2 был кратным 8, добавление 7 не достигнет следующего более высокого кратного 8, но в противном случае оно будет. Таким образом, выражение в целом округляется до следующего кратного 8.
Кстати, моя предпочтительная формулировка округляет число до следующего более высокого значения, которое не превышает кратность 8, а затем ударяет его до следующего кратного. Это позволяет избежать повторения магического числа "7", а в некоторых наборах команд подход будет сохранять код.