2009-12-26 17 views

Respuesta

35

Esto se puede hacer usando un campo de 1 bit como en el siguiente código:

#include<iostream> 

struct OddEven{ 
    unsigned a : 1; 
}; 
int main(){ 
    int num; 
    std::cout<<"Enter the number: "; 
    std::cin>>num; 
    OddEven obj; 
    obj.a = num; 
    if (obj.a==0) 
     cout<<"Even!"; 
    else 
     cout<<"Odd!"; 
    return 0; 
} 

Desde que obj.a es un valor de un campo, sólo el LSB se llevará a cabo allí! Y puede verificarlo por su respuesta. 0 -> ¡Incluso de lo contrario es impar ...!

+2

no portátil, pero espeluznantemente artístico –

+7

Si realiza el bitfield 'unsigned' en lugar de' int', ¡se vuelve perfectamente portátil! – caf

+0

¡sí! Gracias por señalar, hice la edición ...! – SuperSaiyan

5

Se puede convertir el número en una cadena y comprobar si el último dígito es 1,3,5,7 ó 9.

+0

La rutina de conversión de cadenas probablemente usa el operador del módulo (matemático) internamente para extraer los dígitos del número. – Amnon

+0

sí que se puede hacer! Pero es bastante ineficiente convertir eso a cadena y luego verificar –

+4

@Amnon: los campos de un solo bit propuestos en otros lugares usan operadores bit a bit de forma interna.Es solo una cuestión de qué tan estúpido crees que es este rompecabezas de la entrevista: "muy" o "extremadamente". –

2

no estoy seguro de si == es considerado como un operador matemático, si no hay , a continuación, convertir el número en una cadena y prueba si el último char es igual a 0, 2, 4, 6 u 8.

Editar: == parece ser considerado como un/operador relacional operador de comparación.

6
switch (n) { 
    case 0: 
    case 2: 
    case 4: 
    ... 
     return Even; 
} 
return Odd; 
+0

¡ja, mira lo que nunca pensamos! – jrharshath

+0

¿Por qué está esto downvoted? –

+0

¿Por qué los votos a favor? Sin operadores relacionales y bit a bit, no veo nada mejor. (+1) –

1

... ¿Por qué harías esto?

Esto solo es posible si intenta evitar escribiendo +, -, /, *, &, | ^, o%.

Los conmutadores y la conversión de cadenas tienen tablas de búsqueda implícitas y, por lo tanto, adiciones implícitas.

Los siguientes miradas para evitarlo:

//C/C++ code (psuedo'd up) 
struct BitNum 
{ 
    unsigned int num : 1; 
}; 

... 
BitNum a; 
a.num = number_to_be_tested; 
if(a.num == 0) return EVEN; 

return ODD; 
... 

pero utiliza implícitas & para llegar a sólo el bit.

1

Este es un desafío extraño.

Puede usar el número como un desplazamiento de dirección de memoria para una instrucción de carga. Si su arquitectura requiere que el acceso a la memoria se alinee en desplazamientos de dos bytes, entonces el procesador permitirá cargas desde direcciones pares y lanzará una excepción para una dirección impar (carga desalineada).

+0

¿Qué sucede si hay algunas direcciones pares para las que lanza una excepción (por ejemplo, valores fuera del rango de su mapa de memoria)? –

+0

Eso queda como un ejercicio para el lector. – benzado

14

solución más concisa a su problema:

#include <iostream> 
#include <string> 
#include <bitset> 

int main() { 
    std::string const type[] = {"even", "odd"}; 
    int n; 
    std::cout << "Enter an integer." << std::endl; 
    std::cin >> n; 
    std::cout << type[(std::bitset<1>(std::abs(n))[0])] << std::endl; 
} 
0

¿Qué tal un bit a bit simple o?

bool is_odd(const int &number){ 
return (number == (number | 1)); 
} 
bool is_even(const int &number){ 
return (number != (number | 1)); 
} 

(corregir) hmm ... Supongo que debería leer el título ¿eh?

0
#include <stdio.h> 
#include <math.h> 

void main() 
{ 
    int num; 
    scanf("%d",&num); 

    if(fmod(num,2)) 
    { 
     printf("number is odd"); 
    } 
    else 
     printf("number is even"); 
} 
0
#include<stdio.h> 
int main() 
{ 
    int num,res; 
    printf("\nEnter the number="); 
    scanf("%d",&num); 
    res=num&1; 
    if(res==0) 
    printf("Number is even"); 
    else 
    printf("Number is odd"); 
    return 0; 
} 
+3

La pregunta decía "sin usar operadores bit a bit". 'num & 1' es definitivamente un operador bit a bit. – Flexo

Cuestiones relacionadas