2010-04-23 35 views
41

Tôi đã cố kiểm tra xem NSInteger có lẻ hay không. Tôi đã tìm thấy một cách để làm điều đó bằng cách sử dụng C nhưng nó không làm việc với Objective-C. Làm thế nào tôi sẽ làm điều này?Kiểm tra xem NSInteger có lẻ hay thậm chí

Trả lời

115

NSInteger được định nghĩa là int (hoặc long trên một số môi trường). Vì vậy, việc kiểm tra tính kỳ quặc giống như đối với đồng bằng int:

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

Không hoạt động. http://cl.ly/c7k. – Joshua

+0

phải có điều gì đó sai với định nghĩa biến "số nguyên" của bạn.Dù sao tôi thích câu trả lời của Horace hơn – Vladimir

+0

Định nghĩa là: \t 'NSInteger * số nguyên;' – Joshua

17
NSInteger n = 5; 

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

hoặc sử dụng nếu

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

với một số đầu ra:

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

ví dụ con trỏ:

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

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

Làm cách nào để đặt điều này trong câu lệnh 'if'? – Joshua

+0

"nếu" cách thêm. – ohho

+0

Vì lý do nào đó, cách 'if' không hoạt động. http://cl.ly/ceo – Joshua

8

Theo như tôi biết. NSInteger, không giống như NSNumber, chỉ là một typeder cho một loại nguyên thực dọc theo dòng:

typedef long NSInteger; 

Vì vậy, bạn sẽ có thể làm:

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

Dưới đây là một chương trình hoàn chỉnh, biên soạn dưới Cygwin với GNUstep, minh họa điều này:

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

Kết quả đầu ra:

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

Dường như không hoạt động. http://cl.ly/Zdg – Joshua

+0

Bạn có chắc là bạn khai báo biến là NSInteger không? Tôi chỉ từng thấy vấn đề đó ("Toán hạng không hợp lệ cho nhị phân X", trong đó X là toán tử C hợp lệ) khi bạn khai báo biến là NSInteger * (con trỏ thay vì số nguyên thực). Hãy thử chương trình hoàn toàn có trong bản chỉnh sửa của tôi. – paxdiablo

+0

Tôi nghĩ câu trả lời này là tốt nhất. '((nsintvar% 2) == 0)' ngắn gọn hơn; không trộn các kiểu bool và integer. – capikaw

3

Các câu trả lời khác sẽ hoạt động. Có lẽ đó là một vấn đề với makefile của bạn hoặc một cái gì đó. Hãy suy nghĩ bên ngoài đoạn mã đó.

Nếu mọi thứ khác không thành công, hãy khai báo số nguyên là int. Bạn không phải khai báo nó là NSInteger.

2

Sử dụng toán tử "%". Về cơ bản, nó hoạt động phần còn lại khi bạn chia một số. Vì vậy:

số% 2

Sẽ là = 0 nếu số thậm chí là số chẵn chia cho 2 không có phần dư. Nếu nó không = 0, nó phải là lẻ.

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]); 

Hy vọng nó sẽ giúp !!!

Các vấn đề liên quan