2016-04-19 3 views
5

Я новичок в scala и пытался получить доступ к оператору scala not. Я узнал, что я могу использовать оператор «-» для логической операции NOT. Но иногда этот оператор дает мне отрицательный ответ, такой как (-1)Почему использование оператора «~» в scala дает мне отрицательное значение

Например:

val x = 1 
val y =(~x) 

Здесь значение у дает мне -1 вместо 0. Но мне нужен ответ в форма 1 или 0. Может ли кто-нибудь сказать мне, что мне здесь не хватает? Благодарим вас за помощь.

+5

Я смущен: ваш вопрос (название, текст) относится к оператору минус ('-'), но в вашем примере кода используется тильда (' ~ ') - что это такое? –

+0

@TzachZohar Извините. Я говорил о «~» операторе. – Goldengirl

+0

Что заставляет вас думать, что 'Int.unary_ ~' выполняет логическую операцию NOT? В [документации] (http://scala-lang.org/api/current/index.html#[email protected]_~:Long) говорится: «Возвращает ** поразрядное отрицание ** этого значения». [Оба] (http://stackoverflow.com/a/36693869/2988) [ответы] (http://stackoverflow.com/a/36694040/2988) на ваш [последний вопрос] (http://stackoverflow.com/q/36693811/2988) говорят, что это побитовый оператор. Оба ответа ссылаются на документацию, говорящую, что это побитовый оператор. –

ответ

9

В отличие от многих других языков, Scala не поддерживает использование чисел или других видов значений в контекстах, где ожидается булевское. Например, ни одна из следующих строк скомпилировать:

if (1) "foo" else "bar" 
if ("1") "foo" else "bar" 
if (List(1)) "foo" else "bar" 

Некоторые языки имеют представление о том, «truthiness», который был бы использован здесь, чтобы определить, имеет ли условие, но Scala это не распространяется, если вы хотите булево , вам необходимо использовать Boolean.

Это означает, что обычное логическое отрицание не имеет смысла для чисел, а ~ - это нечто совершенно иное - оно дает вам побитовое отрицание, которое не то, что вы хотите. Вместо этого, кажется, скорее всего, вы хотите что-то вроде этого:

val x = 1 
val nonzeroX = x != 0 
val y = !nonzeroX 

Т.е., вы явно преобразовать ваш номер в логическое значение, а затем работать с этим с помощью стандартного логического отрицания (!).

3

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

Если вы хотите простое логическое отрицание, просто используйте Booleans и !.

PS: Обратите внимание, что в коде, который вы отправили, значение y будет -2, а не -1, как вы написали в своем посте.

2

Если вы хотите конвертировать его с 0 в 1 или наоборот, вы можете использовать оператор ^ (XOR).

val x = 1 
val y = 1^x