Один и тот же знак двух целых - PullRequest
0 голосов
/ 13 мая 2018

Пожалуйста, посмотрите на мой код:

#include <stdio.h>
#include <stdbool.h>

void checksign(int, int);
bool samesign(int, int);

int main() {
    printf("Check same sign\n\n");

    int a = 27952, b = -68643, c = 0;

    checksign(a, a);
    checksign(a, b);
    checksign(a, c);
    checksign(b, b);
    checksign(b, c);
    checksign(c, c);

    return 0;
}

void checksign(int a, int b) {
    printf("%d and %d have ", a, b);
    if (!samesign(a, b)) {
        printf("not ");
    }
    printf("the same sign.\n");
}

bool samesign(int a, int b) {
    return (a | 0) == (b | 0);
}

Я прочитал соответствующие темы здесь, где все показали разумные решения.Я действительно не могу понять, почему / как работает моя функция samesign (по крайней мере для меня, на 64-битном Linux, скомпилированном с GCC 7.3.0).Любая помощь или понимание приветствуется.

1 Ответ

0 голосов

Ваш исходный код совершенно неверен, так как a | 0 == a для всех a, и поэтому (a|0) == (b|0) эквивалентно a == b.

Для со знаком a, b, вернуть false, если они имеют противоположные знаки.Обратите внимание, что 0 считается положительным знаком, хотя -0 == 0.Наивная имплантация приведена ниже.

bool samesign(int a, int b) {
    if ((a < 0) && (b >= 0))
        return false;
    if ((a >= 0) && (b < 0))
        return false;
    return true;
}

Однако ... Существует более умное и эффективное решение, использующее всего лишь одну строку, с использованием битовых манипуляций и просто обдумыванием знакового бита (на основе дополнения до двух)цифры):

bool samesign(int a, int b) {
    /* Sign bit of XOR is 1 if only one of a or b is negative. */
    /* That means, signed a XOR b is negative if they have opposing signs. */
    return (signed int)(a ^ b) >= 0;
}

Ожидаемые результаты должны быть:

27952 and 27952 have the same sign.
27952 and -68643 have not the same sign.
27952 and 0 have the same sign.
-68643 and -68643 have the same sign.
-68643 and 0 have the same sign. 
0 and 0 have the same sign.    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...