2009-12-26 13 views

Odpowiedz

35

Można to zrobić przy użyciu pola 1 trochę jak w poniższym kodzie:

#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; 
} 

Od tego obj.a jest wartością jednego pola, tylko LSB odbędzie się tam! I możesz to sprawdzić za odpowiedź .. 0 -> Nawet inaczej Odd .. !!

+2

nieprzenośny, ale strasznie artystyczny –

+7

Jeśli tworzysz bitfield 'unsigned' zamiast' int', staje się całkowicie przenośny! – caf

+0

tak! Dzięki za wskazanie, zrobiłem wydanie ..! – SuperSaiyan

5

Można konwertować liczby na ciąg znaków i sprawdzić, czy ostatnia cyfra to 1,3,5,7 lub 9.

+0

Procedura konwersji ciągów prawdopodobnie używa wewnętrznego (matematycznego) modułu modulus w celu wyodrębnienia cyfr numeru. – Amnon

+0

tak, to można zrobić! Ale jest to dużo nieefektywne, aby przekonwertować to na ciąg, a następnie sprawdzić –

+4

@ Amnon: jednobitowe pola zaproponowane gdzie indziej używają operatory bitowe wewnętrznie.To tylko kwestia tego, jak głupia jest twoja łamigłówka: "bardzo" lub "bardzo". –

2

Nie jestem pewien, czy == jest uważany jako operator matematyczny, jeśli nie ma , następnie przekonwertuj liczbę na ciąg i sprawdź, czy ostatni znak jest równy 0, 2, 4, 6 lub 8.

Edytuj: == wydaje się być traktowany jako operator porównania/operator relacyjny.

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

ha, zobacz, o czym nigdy nie pomyśleliśmy! – jrharshath

+0

Dlaczego jest to odrzucane? –

+0

Dlaczego spadki? Bez operatorów relacyjnych i bitowych nie widzę nic lepszego. (+1) –

1

... Dlaczego to zrobiłeś?

Jest to możliwe tylko, jeśli próbujesz uniknąć pisania +, -, /, *, &, |^lub%.

Przełączniki i konwersja ciągów mają domyślne tabele odnośników, a więc niejawne dodatki.

Poniższe wygląd, aby uniknąć go:

//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; 
... 

ale ukryte zastosowania & aby dostać się tylko trochę.

1

To jest dziwne wyzwanie.

Możesz użyć tego numeru jako przesunięcia adresu pamięci dla instrukcji ładowania. Jeśli architektura wymaga dostępu do pamięci w celu wyrównania dwubajtowego, procesor zezwoli na ładowanie z parzystych adresów i generuje wyjątek dla nieparzystego adresu (niepodpisany ładunek).

+0

Co jeśli są niektóre równe adresy, dla których zgłasza wyjątek (na przykład wartości poza zakresem jego mapy pamięci)? –

+0

Zostało to ćwiczeniu dla czytelnika. – benzado

14

Najbardziej zwięzły rozwiązanie problemu:

#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

Jak o prostym bitowym OR?

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

(edycja) hmm ... Przypuszczam, że powinienem przeczytać tytuł 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

Pytanie brzmiało "bez użycia operatorów bitowych". 'num & 1' jest zdecydowanie operatorem bitowym. – Flexo

Powiązane problemy