2010-04-23 16 views

Respuesta

115

NSInteger se define como int (oen algunos entornos). Así que comprobar en rareza es como para llano int:

NSInteger num; 
if (num % 2) 
    // odd 
else 
    // even 
+0

No funciona tampoco. http://cl.ly/c7k. – Joshua

+0

debe haber algo mal con su definición de variable "entera".De todos modos, me gusta la respuesta de Horace más – Vladimir

+0

La definición es: \t 'NSInteger * entero;' – Joshua

17
NSInteger n = 5; 

NSLog(@"%s", n & 1 ? "odd" : "even"); 

o usar si

if (n & 1) { 
    ; // odd 
} else { 
    ; // even 
} 

con un poco de salida:

if (n & 1) { 
    NSLog(@"odd"); 
} else { 
    NSLog(@"even"); 
} 

el ejemplo puntero:

NSInteger x = 7; 
NSInteger *y = &x; 

if (*y & 1) { 
    NSLog(@"odd"); 
} else { 
    NSLog(@"even"); 
} 
+0

¿Cómo pondría esto en una declaración 'if'? – Joshua

+0

"si" se agregó la forma. – ohho

+0

Por alguna razón, el modo 'if' no funciona. http://cl.ly/ceo – Joshua

8

Por lo que yo sé. NSInteger, a diferencia de NSNumber, es sólo un typeder a un verdadero tipo entero a lo largo de las líneas de:

typedef long NSInteger; 

Por lo que debe ser capaz de hacer:

NSInteger nsintvar = 77; 
if ((nsintvar % 2) == 0) { 
    // number is even 
} else { 
    // number is odd 
} 

Aquí es un programa completo, compilado en Cygwin con GNUstep, que lo ilustra:

#import <stdio.h> 
#import <Foundation/NSObject.h> 

int main(int argc, const char *argv[]) { 
    NSInteger num; 
    for (num = 0; num < 20; num++) { 
     if ((num % 2) == 0) { 
      printf ("%d is even\n", num); 
     } else { 
      printf ("%d is odd\n", num); 
     } 
    } 
    return 0; 
} 

Emite:

0 is even 
1 is odd 
2 is even 
3 is odd 
4 is even 
5 is odd 
6 is even 
7 is odd 
8 is even 
9 is odd 
10 is even 
11 is odd 
12 is even 
13 is odd 
14 is even 
15 is odd 
16 is even 
17 is odd 
18 is even 
19 is odd 
+0

Parece que no funciona. http://cl.ly/Zdg – Joshua

+0

¿Estás seguro de que declaras la variable como NSInteger? Solo he visto ese problema ("Operandos inválidos a X binario", donde X es un operador C válido) cuando declaras la variable como NSInteger * (el puntero en lugar del entero real). Prueba el programa completamente contenido en mi edición. – paxdiablo

+0

Creo que esta respuesta es la mejor. '((nsintvar% 2) == 0)' es más conciso; no mezcla los tipos bool y entero. – capikaw

3

Esas otras respuestas deberían funcionar. Tal vez sea un problema con tu archivo MAKE o algo así. Piensa fuera de ese pedazo de código.

Si todo lo demás falla, solo declare el entero como un int. No tiene que declararlo como NSInteger.

2

Utilice el operador "%". Básicamente, funciona el resto cuando se divide un número. Por lo tanto:

número 2%

sería = 0 si el número era aún, como un número par dividido por 2 no tiene residuos. Si no es = 0, debe ser impar.

0
NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", nil]; 
// NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", nil]; 
// NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", @"C", nil]; 
// NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", nil]; 
// NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", nil]; 

NSArray *arrLeft; 
NSArray *arrRight; 

NSRange range; 
range.location = 0; 
range.length = ([arrayTotal count] % 2) ? ([arrayTotal count]/2) + 1 : ([arrayTotal count]/2); 

arrLeft = [arrayTotal subarrayWithRange:range]; 

range.location = range.length; 
range.length = [arrayTotal count] - range.length; 

arrRight = [arrayTotal subarrayWithRange:range]; 

NSLog(@"Objects: %lu", (unsigned long)[arrLeft count]); 
NSLog(@"%@", [arrLeft description]); 

NSLog(@"Objects: %lu", (unsigned long)[arrRight count]); 
NSLog(@"%@", [arrRight description]); 

Hope it helps !!!

Cuestiones relacionadas