sharp - comparar variables en c++
Comparando dos enteros sin ninguna comparaciĆ³n (12)
¿Es posible encontrar el mayor de dos enteros sin ninguna comparación? Encontré algunas soluciones:
if(!(a/b)) // if a is less than b then division result will be zero.
{
cout << " b is greater than a";
}
else if (!(a-b)) // we know a is greater than or equal to b now. check whether they are equal.
{
cout << "a and b are equal";
}
else
cout << "a is greater than b";
Pero si (c) o si (! C) es una comparación a cero. Además, no funciona para números negativos. De hecho, necesito una solución que evite cualquier declaración if. En su lugar, debería usar instrucciones de conmutación y operadores aritméticos. ThanX.
Aquí hay una versión divertida que no tiene ninguna rama condicional.
int g = (int)"greater";
int l = (int)"less";
int e = (int)"equal";
int a = 7;
int b = 10;
char *result = (char*)((((a - b) >> 31) & l) | (((b - a) >> 31) & g) | ((~((a - b) | (b - a))) >> 31) & e);
cout << result;
La Idea Perversa: use una matriz de indicadores de función. Luego, con algunas operaciones aritméticas y bit a bit, obtenga un índice en esa matriz.
Ninguna de las muestras presentadas en la pregunta o ninguna de las respuestas hasta ahora protege de la división por cero. ¿Por qué diantres estás tratando de evitar una declaración ''si''? Sospecho que la tarea pregunta acerca de: operadores.
cout << "Maximum is: " << ((a>b)?a:b)
Aquí vamos.
No es posible comparar dos números sin una comparación. Puedes cambiarlo y hacer una operación indirecta, pero al final del día estás comparando algo. Confíe en el compilador para optimizar el código y seleccionar las mejores operaciones.
Puede explotar el hecho de que el signo del cálculo a - b
depende de qué número es mayor. Esto se usa en muchas implementaciones de comparación. Pero creo que nunca podrás evitar por completo la comparación. En este caso, al menos necesita evaluar el contenido del indicador de firma en el procesador.
Si solo necesitas mostrar el número más bajo, también puedes usar trucos aritméticos:
result = ((a + b) - sqrt((a - b) * (a - b))) / 2
EDITAR erm ... ¿puedes usar el switch
?
Debería usar instrucciones de cambio y operadores aritméticos.
switch
es básicamente el mismo que el encadenado if
y, como tal, también usa la comparación. Esto suena como si simplemente debiera comparar con cero para ver qué signo tiene a - b
.
Restarlos y revisar el letrero usando burlas poco hábiles twiddling
http://graphics.stanford.edu/~seander/bithacks.html
No haga esto en el código de producción si los otros programadores saben dónde vive.
Simplemente no puedo ver ninguna buena razón para hacer eso: ¿quién querría programar sin "si"?
una posible respuesta es:
((a + b) + abs (a -b)) / 2
Creo que "abs" solo oculta un "si" en algún lugar, al igual que el operador ternario que es solo otro nombre para "si" ...
char c c = 0x3D + (! (b / a) && (ab)) - (! (a / b) && (ab)) printf ("a% cb", c);
(!(a/b) ? cout << " b is greater than a" : (!(b-a) ? cout << "a and b are equal" : cout << "a is greater than b") : cout << "a is greater than b");
Eso se pone un poco desordenado
Editar: ¿Es esta tarea?
Como un ejercicio sin sentido, aquí hay una forma de implementar una función cond
: para cumplir el propósito de if
, suponiendo que (y el switch
, y ?:
:) Hubieran desaparecido de algún modo del lenguaje, y estás usando C ++ 0x.
void cond(bool expr, std::function<void ()> ifTrue, std::function<void ()> ifFalse)
{
std::function<void ()> choices[2] = { ifTrue, ifFalse };
choices[expr == false]();
}
p.ej
cond(x > y,
/*then*/ [] { std::cout << "x is greater than y"; },
/*else*/ [] { std::cout << "x is not greater than y"; });
Como digo, inútil.
Pruebe esto, lo probó, funciona bien.
public static int compare(int a, int b)
{
int c = a - b;
return (c >> 31) & 1 ^ 1;
}
Creo que este método es mejor que otros, puede usar esta lógica c y java ambos lenguajes de programación, pero int debe ser de 4 bytes si int es de 2 bytes y luego hacer 15 bytes de desplazamiento a la derecha en lugar de 31 bytes.
enter code here
#include<stdio.h>
main()
{
int a, b;
printf("Enter three numbers/n");
scanf("%d %d", &a, &b);
printf("Largest number is %d /n",findMax( a,b ));
}
int findMax( int x, int y)
{
int z = x - y;
int i = (z >> 31) & 0x1;
printf("i = %d shift = %d /n", i, (z>>31));
int max = x - i * z;
return max;
}
void greater(int a, int b) {
int c = a - b;
switch(c) {
case 0:
cout << "a and b are equal" << endl;
break;
default:
int d = c & (1<<31);
switch(d) {
case 0:
cout << "a is bigger than b" << endl;
break;
default:
cout << "a is less than b" << endl;
}
}
}