Преобразование 0 в 1 и наоборот

меня спросили в интервью: как преобразовать 0 в 1 и 1 в 0. Я ответил:--3-->

  1. простой if и switch
  2. битовые операции.

есть ли другой подход?

10 ответов


несколько очевидных возможностей:

!n
1-n
n^1
n==0
n!=1
n<1

простая арифметика:

x = 1 - x;

На самом деле существует бесконечное число полиномов, которые будут отображать от 1 до 0 и наоборот. Например:

x = x * x * x * x * x - x * x * x * x + x * x - 2 * x + 1;

таблица подстановки:

int[] swap = { 1, 0 };

и затем:

x = swap[x];

возьмите скрепку. Уладьте это. Это 1. Согните его так, чтобы он соответствовал своим концам. Это 0. Чтобы сделать его 1, выпрямить его.


Они, вероятно, ожидали, что вы будете использовать побитовое не


Некоторые Тригонометрические: COS (PI * N)^2

в python

import math
math.cos(math.pi * n)  ** 2

Я не могу поверить, что люди забыли модуля:

(3 + n) % 2

Это не лучший, но он работает:

pow(0, n);

Я думаю, вы могли бы сделать ABS (VAR - 1), но я думаю, что ваши подходы более элегантны


я использовал -~-n в JavaScript. Он преобразует 1 в -1, который представлен как 11111111, затем переворачивает биты 00000000 что равно 0. Второй отрицательный знак не влияет на 0. С другой стороны, если n 0, то первый отрицательный знак не имеет никакого эффекта, Тильда переворачивает биты, а второй отрицательный знак преобразует -1 до 1.


Это должно работать для любых двух чисел...

(EDIT: глядя на другие ответы, я, возможно, неправильно понял вопрос... но мне все равно нравится мой ответ :-)

public class X
{
    public static void main(final String[] argv)
    {
        int x = Integer.parseInt(argv[0]);
        int y = Integer.parseInt(argv[1]);

        x += y;
        y = x - y;
        x = x - y;

        System.out.println(x);
        System.out.println(y);
    }
}