Знак целого и двоичного И проверить - PullRequest
1 голос
/ 17 марта 2020

Если я прав в C ++, младший бит является последним битом и определяет знак целого числа. Так, например, в случае 8-битного 1111 1111 будет -127, а 1111 1110 будет 127. Пожалуйста, исправьте меня, если я ошибаюсь, но это не имеет отношения.

Я бы проверил для знака целое число в Go, поэтому я написал следующее:

func signCheck(n int8) {
    var sign int8 = 1<<7

    if n&sign == 1 {
        fmt.Printf("%d is odd - %b\n", n, n)
    } else {
        fmt.Printf("%d is even - %b\n", n, n)
    }
}

Это выведет «константы 128 переполнений int8», но это имеет смысл, потому что для определения числа используется только 7 бит. Поэтому я изменил следующим образом:

func signCheck(n int8) {
    if n&1<<7 == 1 {
        fmt.Printf("%d is odd - %b\n", n, n)
    } else {
        fmt.Printf("%d is even - %b\n", n, n)
    }
}

В этом случае мне не нужно говорить, что это int8, но я протестировал его с -127 и 127 и получил следующие отпечатки:

-127 is even - -1111111
127 is even - 1111111

Так в таком случае, как мне проверить наличие знака? go версия go1.13.1 linux / amd64

1 Ответ

2 голосов
/ 17 марта 2020

Для представления отрицательных целых чисел, Go (и я считаю, что C ++, как и большинство языков), использует формат и стандарт 2 в качестве дополнения .

В 2 дополняет старший бит (MSB) будет 1, если число отрицательное, и 0 в противном случае.

В Go вы не можете использовать типизированную константу 0x80, имеющую int8 в качестве типа, потому что это вне его допустимый диапазон.

Однако вы можете конвертировать int8 в uint8 "без потерь", и тогда вы можете сделать это.

Кроме того, когда вы маскируете бит 0x80 Вы должны сравнить результат с 0x80, потому что x & 0x80 никогда не может привести к 1, только к 0 или 0x80.

func signCheck(n int8) {
    if uint8(n)&0x80 == 0x80 {
        fmt.Printf("%d is negative - %b\n", n, n)
    } else {
        fmt.Printf("%d is non-negative - %b\n", n, n)
    }
}

Другой вариант - сравнить маскирование результат для 0:

if uint8(n)&0x80 != 0 { }

Оба решения выдают результат (попробуйте их на Go Playground ):

-127 is negative - -1111111
127 is non-negative - 1111111
...