Validar parámetro para 0 o 1

Tengo un número de parámetro de tipo int , donde el usuario puede asignarle uno de dos valores: 0 o 1 .
Puedo comprobarlo usando lo obvio:

 if (num  1) print("The parameter value is incorrect.\n"); 

Pero me preguntaba si habría un mejor (¿más rápido? ¿Menos código?) Para hacer esto?

EDITAR
Este es un código de flujo de datos, por lo que el rendimiento es esencial. Estoy buscando una manera más rápida de ejecutar esta comprobación.

Gracias

Claro código sobre (ingenuo) micro-optimizaciones

Esencialmente estás haciendo suposiciones erróneas sobre el comportamiento real del comstackdor. En ambos casos, es decir:

 if (num < 0 || num > 1) { ... 

y

 if (num != 0 && num != 1) { ... 

un comstackdor optimizador lo reducirá de todos modos a la forma más corta. Puede ver que, ambos generan el mismo ensamblaje, que podría verse como (plataforma x86):

 cmp $0x1,%eax jbe 1e  # jump if below or equal 

Esto ya es lo suficientemente rápido, ya que la instrucción cmp en todas las architectures principales tiene una latencia de un ciclo .

La conclusión es elegir cualquier código, que aclare su intención para usted, los futuros mantenedores y deje que el comstackdor haga su trabajo. Solo asegúrese de configurarlo con el nivel de optimización adecuado (por ejemplo, -O2 o superior).


Predicción de twig de ayuda

Sin embargo, si el rendimiento es realmente crucial aquí (y lo perfila así, ¿no?), Entonces podría pensar en otro tipo de optimización, que es el nivel de predicción de bifurcación (suponiendo que su CPU lo admita). El GCC tiene __builtin_expect intrinsic, que permite insinuar el comstackdor, que en la mayoría de los casos se tomará o no la twig.

Puede usar __builtin_expect para proporcionar al comstackdor información de predicción de twig. En general, debería preferir utilizar comentarios de perfil reales para esto (-archivo de perfiles), ya que los progtwigdores son muy malos para predecir el rendimiento real de sus progtwigs. Sin embargo, hay aplicaciones en las que estos datos son difíciles de recostackr.

Por ejemplo, si está seguro, esa función toma 0 o 1 en aproximadamente el 99% de los casos, entonces podría escribirlo como:

 #define unlikely(x) __builtin_expect((x), 0) if (unlikely(num != 0 && num != 1)) { ... 

Iría en claridad en lugar de menos caracteres:

 if (num != 0 && num != 1){ print("The parameter value is incorrect.\n"); } 

cuando son las 2 AM y está depurando un progtwig, lo último que quiere es sobre-pensar sobre los rangos y las operaciones bitwise.

 if (!!num == num) { /* value is either a zero or 1 */ } 

!! cambiará otros valores a 0 o 1, así que si intentaste pasar 5:

 if (1 == 5) // FALSE: 

puedes usar el operador de turno

 if(num>>1) print("The parameter value is incorrect.\n"); 

Dado que el único bit que puede encenderse es el primero, comprobar que el rest de los bits están apagados es el truco.

Además, como solo es 1 , el negativo es (en syntax de c ): ~1 .

Asi que:

 if (num & ~1) print("The parameter value is incorrect.\n"); 

Estoy de acuerdo if (num < 0 || num > 1) { ... es el camino a seguir

Pensé que añadiría un código como respuesta de golf.

 if (num > 1u) { ... 

Esto convierte int num en un unsigned antes de compararlo con 1u .

Una debilidad de este enfoque es si num se hace para un tipo con unsigned más amplio que unsigned . En ese caso, el código podría “calmarnos” en una mayor oscuridad.

 if (num > 1ull) { ... 

Al final, usando (num < 0 || num > 1)

  1. Genera el código más rápido o

  2. Generar código deficiente y OP realmente debería buscar un mejor comstackdor para mejorar el rendimiento general que una optimización de código tan pequeña.

Hay muchas maneras de hacer eso. Creo que los caminos cortos no siempre son los correctos. Piense que hay ocasiones en las que probablemente necesite informar al usuario sobre su entrada, no solo diciendo “El valor del parámetro es incorrecto”. Yo, tengo mi propia función, prueba esto:

 #include int checkInput(int min, int max); int main(void){ int number = checkInput(0,1); printf("\nYour number is\t%d\n",number); return 0; } int checkInput(int min, int max){ int option,check; char c; do{ printf("Please type a number beetwen %d and %d:\t",min,max); if(scanf("%d%c",&option,&c) == 0 || c != '\n'){ while((check = getchar()) != EOF && check != '\n'); printf("\tI sayed a Number please\n\n"); }else if(option < min || option > max){ printf("\tThe number has to be beetwen %d and %d\n\n",min,max); }else{ break; } }while(1); return option; } 

Salida:

 Please type a number beetwen 0 and 1: 0k I sayed a Number please 
 Please type a number beetwen 0 and 1: 1j I sayed a Number please Please type a number beetwen 0 and 1: 8 The number has to be beetwen 0 and 1 Please type a number beetwen 0 and 1: 1 Your number is 1