2013-04-12 38 views
8

Hầu hết các toán tử modulo % được sử dụng để kiểm tra với số chẵn hoặc lẻ.Thử nghiệm với số lẻ

Bây giờ câu hỏi của tôi là, liệu có bất kỳ kiểm tra vấn đề đối với một số lẻ sử dụng toán tử AND, vì nó cảm thấy thử nghiệm nhiều tự nhiên hơn cho dù các bit ngoài cùng bên phải là 1 hoặc 0 hơn là làm một tấm séc modulo chống 2

Và khi chuyển đổi 32 bit không thay đổi bit ngoài cùng bên phải.

Cả

(1 + Math.pow(2,52)) & 1 //1

(1 + Math.pow(2,52)) % 2 //1

mang lại kết quả tương tự.

Có lý do nào để thích toán tử modulo hơn bitwise không?

Edit: Câu hỏi này chỉ chiếm giá trị mà rơi vào phạm vi chính xác 64bit như chỉ số chẵn có thể được biểu diễn chính xác trên 2^53 và do đó cả hai toán hạng thất bại (9007199254740993 % 2 //0)

+1

Modulo được sử dụng để tìm phần còn lại của bộ phận. Thật trùng hợp, nó có thể được sử dụng như một kiểm tra chẵn lẻ. – Shark

+2

Câu hỏi hay! – Pointy

+0

@Pointy Thanks =) – C5H8NNaO4

Trả lời

7

Trong JavaScript, sử dụng bất kỳ toán tử bitwise làm cho số đầu tiên bị cắt bớt thành số nguyên 32 bit, điều đó có nghĩa là nó sẽ không hoạt động đối với một số giá trị lớn hơn (Vâng, một vài giá trị lớn hơn :-)

Toán tử % không làm

chỉnh sửa — hey tất cả những người bạn tốt đẹp đã upvoted tôi: giữ ngựa của bạn :-) C5H8NNaO4 chỉ ra rằng quá trình cắt ngắn số nguyên nên bảo vệ bit thấp, mà làm cho cảm giác trực quan nếu bạn nghĩ về chỉ lopping off phần trên của mantissa, và thực sự một số "kiểm tra" cursory chỉ ra rằng nó có vẻ làm việc tốt.

Mọi thứ trở nên phức tạp hơn đối với thực sự giá trị lớn, khi được biểu thị bằng dấu phẩy động không chính xác có thể là lẻ hoặc chẵn, vì số chữ số ít quan trọng nhất bị thiếu. Nói cách khác, khi số mũ nhị phân trong một giá trị dấu chấm động dẫn đến một giá trị hiệu quả lớn hơn dung lượng mantissa (53 bit tôi nghĩ), thì bạn phải xem xét tất cả các số đó ngay cả (vì bit thấp luôn bằng không) nếu không bạn phải xem xét câu hỏi không xác định.

Nên rõ ràng rằng tôi không phải là nhà toán học.

+0

+1 Ngoài các nhà khai thác bitwise. Để mượn từ các phần tốt của Crockford: 'JavaScript không có số nguyên. Nó chỉ có các số dấu chấm động chính xác gấp đôi. Vì vậy, các toán tử bitwise chuyển đổi toán hạng số của chúng thành các số nguyên, thực hiện công việc kinh doanh của chúng và sau đó chuyển đổi chúng trở lại. Trong hầu hết các ngôn ngữ, các toán tử này rất gần với phần cứng và rất nhanh. Trong JavaScript, chúng rất xa phần cứng và rất chậm. JavaScript hiếm khi được sử dụng để thực hiện thao tác bit.' – Nope

+0

Câu trả lời xuất sắc. Và đối với bất kỳ ai lo lắng rằng '%' có thể được định nghĩa theo các số nguyên, nó không phải là: http://www.ecma-international.org/ecma-262/5.1/#sec-11.5.3 –

+2

Để kiểm tra tính chẵn lẻ, chuyển đổi sang 32-bit dường như không quan trọng, như OP nói. Vì vậy, rõ ràng nó sẽ làm việc, ngay cả đối với các giá trị số nguyên lớn. – bfavaretto

0

Nếu số của bạn sẽ luôn chuyển đổi thành int 32 bit, thì có vẻ như Bitwise có thể nhanh hơn - tôi đoán một số công cụ javascript có thể JIT nó hoạt động bitwise phần cứng. Tôi đã xây dựng một jsperf để kiểm tra nó:

http://jsperf.com/evenness

tôi nhận được kết quả rất khác nhau trên Firefox 20, đôi khi Bitwise là hơi nhanh hơn, nhanh hơn đôi khi nhiều lần.

Nếu số của bạn có thể hoặc có thể không chuyển đổi độc đáo thành inte 32 bit, sau đó dính vào modulo.

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