2010-10-05 8 views
1

Actuellement, mon algorithme est someValue + x. J'essaie de comprendre comment je peux transformer x à 1 si elle est supérieure à 0, ou à 0 si elle est égale à 0.Transformer 'X' en 1 ou 0, si c'est> 0 ou == 0

Je ne veux pas utiliser un if-else pour produire ceci, mais plutôt transformer x dans mon algorithme par lui-même. Par exemple: Si someValue = 20, x = 4. Il produirait 20 + 1 = 21. Mais si x = 0. Il ne ferait que produire 20.

Merci.

+1

serait utile de savoir pourquoi vous ne voulez pas utiliser un if-else –

+0

C'était devoirs, sûrement. –

Répondre

7

Utilisez

someValue + (x>0? 1: 0); 

Mais ne vous inquiétez pas d'écrire un peu pour obtenir ce dont vous avez besoin. Il est important d'écrire du code compréhensible :)

1

return x> 0? someValue + 1: someValue;

mais il finit quand même avec une instruction conditionnelle. Vous ne le faites pas explicitement.

2

En supposant x sera toujours >=0 que vous pouvez faire:

x = (x > 0) ? 1 : 0; 
3

Son fonctionnement simple, vous pouvez simplement utiliser ce

n + (x>0? 1 : 0); 
15

Pourquoi vous voulez faire cela sans une déclaration if peut être discutable mais (à partir de Java 5) Integer a une méthode signum qui retournera -1, 0 ou 1 en fonction de la valeur entière:

int newVal = someValue + Integer.signum (x); 

En supposant que votre valeur d'entrée sera toujours zéro ou plus, cela fera ce que vous voulez. Mais il est peu probable d'être plus vite qu'une déclaration if comme:

int newVal = someValue; 
if (x > 0) newVal++; 

ni plus succinct que la version ternaire:

int newVal = (x > 0) ? someValue + 1 : someValue; 

Je viens bien que je l'inclure comme une option dans le cas où vous ne veulent ni le if ni la variante ternaire.

+2

+1 pour l'utilisation de 'Integer.signum' – oksayt

+0

Eh bien, cela répond à la question mais je ne suis pas sûr que ce soit réellement" meilleur "que n'importe quelle autre solution. Pourtant, c'est une option et il est utile d'en savoir ce que vous en ferez. – paxdiablo

+1

+1 pour l'utilisation de 'if' – Kobi

0

Juste pour jeter quelque chose d'autre dans le mélange qui pourrait fonctionner (mais pas nécessairement une façon raisonnable d'aller à ce sujet) ...

int value = 0; 
try { 
    value = x/x; 
} 
catch (Exception e) { } 
return someValue + value; 
+0

L'idée est intéressante mais une exception de lancement entraînera une performance vraiment médiocre. – ThR37

+0

Je pensais que ça pourrait. Je suppose que ce serait beaucoup plus inefficace qu'un if/else? –

+0

La question de l'OP est non-sensique. Qui se soucie si la performance est mauvaise? –

1

Pour plus de lisibilité, de définir une méthode supplémentaire pour la partie conditionnelle:

public static int absoluteSignum(int x) { 
    return x == 0 ? 0 : 1; 
} 

et l'utiliser dans votre code:

int result = someValue + absluteSignum(x); 
2

aide someValue + (x> 0)?1: 0 devrait au mieux être équivalent à:

si (x> 0) someValue ++;

lors de la compilation, de sorte que la ramification n'est pas évitée. Si vous devez absolument éviter une dérivation, vous pouvez utiliser:

x = - ((~ (x-1) | x) >> 31);

En prime, pour le langage C serait:

x = (~ (x-1) | x) >> (sizeof (x) * CHAR_BIT-1)

Le résultat est 0 si x == 0, 1 sinon. Ce sont des opérations au niveau du bit pur, pas de branches et un total de 5 opérations entières. Pour des trucs similaires (bien que celui-ci ne figure pas, je viens de l'autre il modifié l'algorithme), vous pouvez voir ce bit tripotant page hacks: http://graphics.stanford.edu/~seander/bithacks.html

+1

CHAR_BIT? Vous avez vu le tag Java, oui? :-) – paxdiablo

+0

Oh mon cher, maintenant commuté à Java et quitté la version C parce qu'il était si gentil :) – jjrv

+0

En C, faites juste 'someValue + !! x' – nos

1
x=-((~(x-1)|x)>>31); 

à mon avis, il est le meilleur answer.But d'abord vous devez stocker le X dans un type de données de 32 bits. tel que int (x86).
Aucune branches, Aucun jugement

+0

Aucune lisibilité ... –

+0

@Carlos Heuberger - Ce n'est pas quel OP voulait. Pas de branches, j'aime ça. – Ishtar

+0

Aucune lisibilité? – shenju

2

Si x est un entier non négatif:

return someValue + (x + 2)%(x + 1); 
Questions connexes