Почему побитовая инверсия x определяется как - (x + 1)? [Дубликат]

Мне нравится использовать решение на основе NOT EXIST для этой проблемы:

SELECT id, rev
FROM YourTable t
WHERE NOT EXISTS (
   SELECT * FROM YourTable t WHERE t.id = id AND rev > t.rev
)
12
задан Gabe 28 November 2010 в 06:43
поделиться

6 ответов

19
ответ дан Phrogz 4 September 2018 в 09:55
поделиться

Это связано с тем, как отрицательные числа представлены как биты. Для этого наиболее часто используются Дополнения .

-2 в этом обозначении 1111110, которое отрицает 1

0
ответ дан BrokenGlass 4 September 2018 в 09:55
поделиться

Это помогает, если вы посмотрите на него в двоичном формате.

Прежде всего, как вы знаете, отрицательные числа выражаются как (максимально возможное беззнаковое число плюс 1 минус значение). Таким образом, -1 в 16-битовом целое, которое имеет наивысшее значение без знака 65535, будет 65536-1 = 65535, то есть 0xffff в шестнадцатеричном формате или 1111 1111 1111 1111 в двоичном формате.

So:

1 в двоичном формате = 0000 0000 0000 0001

НЕ на всех битах приведет к 1111 1111 1111 1110. То, что в десятичной системе, равно 65534. И 65536 минус 65535 равно 1, поэтому это -1.

10
ответ дан Community 4 September 2018 в 09:55
поделиться
    Dim mask As Integer = -1
    '11111111111111111111111111111111

    For x As Integer = -3 To 3
        Dim i As Integer = x
        Debug.WriteLine("")
        Debug.WriteLine("'" & Convert.ToString(i, 2).PadLeft(32, "0"c) & " > Num = " & i.ToString)

        i = i Xor mask 'reverse the bits (same as Not)
        Debug.WriteLine("'" & Convert.ToString(i, 2).PadLeft(32, "0"c) & " > Not = " & i.ToString)

        i += 1 'convert to two's complement
        Debug.WriteLine("'" & Convert.ToString(i, 2).PadLeft(32, "0"c) & " > 2's Comp = " & i.ToString)
    Next

    'debug results

    '11111111111111111111111111111101 > Num = -3
    '00000000000000000000000000000010 > Not = 2
    '00000000000000000000000000000011 > 2's Comp = 3

    '11111111111111111111111111111110 > Num = -2
    '00000000000000000000000000000001 > Not = 1
    '00000000000000000000000000000010 > 2's Comp = 2

    '11111111111111111111111111111111 > Num = -1
    '00000000000000000000000000000000 > Not = 0
    '00000000000000000000000000000001 > 2's Comp = 1

    '00000000000000000000000000000000 > Num = 0
    '11111111111111111111111111111111 > Not = -1
    '00000000000000000000000000000000 > 2's Comp = 0

    '00000000000000000000000000000001 > Num = 1
    '11111111111111111111111111111110 > Not = -2
    '11111111111111111111111111111111 > 2's Comp = -1

    '00000000000000000000000000000010 > Num = 2
    '11111111111111111111111111111101 > Not = -3
    '11111111111111111111111111111110 > 2's Comp = -2

    '00000000000000000000000000000011 > Num = 3
    '11111111111111111111111111111100 > Not = -4
    '11111111111111111111111111111101 > 2's Comp = -3
0
ответ дан dbasnett 4 September 2018 в 09:55
поделиться

Большинство (все?) современных архитектур используют дополнение двух для представления целых чисел. Таким образом, побитовое NOT является дополнением к целому числу минус единица.

0
ответ дан Nisse Engström 4 September 2018 в 09:55
поделиться

Это потому, что бит-мудрый оператор буквально инвертирует каждый бит в слове. Это НЕ строго арифметическая операция, это логическая операция.

-2 ==% 1110, ~ -2 == ~% 1110 =% 0001 == 1 -1 ==% 1111, ~ -1 == ~% 1111 =% 0000 == 0

и т. Д.

Чтобы перейти от -2 к 2 и от 1 до -1, вам нужно использовать арифметику операция отрицания.

0
ответ дан Peter G. McDonald 4 September 2018 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: