2013-12-12 30 views
20

Tôi đang cố gắng hiểu cách biểu thức palindrome này cho 42. Tôi biết về các quy tắc ưu tiên toán tử, nhưng điều này vượt quá mức Javascript hiện tại của tôi. Làm thế nào tôi có thể bắt đầu?Tại sao câu trả lời là 42?

alert ("The answer is " + 

[(0>>(0==0))+([0]+[(0==0)+(0==0)]^0)]*[(0^[(0==0)+(0==0)]+[0])+((0==0)<<0)] 

); 
+4

Bắt đầu bằng cách mở bảng điều khiển JavaScript của bạn và xem những gì 'true + true' sẽ đánh giá. – Matt

+2

Nếu bạn biết về quyền ưu tiên của toán tử thì bạn có thể ghi lại điều này thành nhiều dòng và thực hiện theo một thao tác tại một thời điểm. – nhgrif

+9

'Tại sao câu trả lời là 42? 'Tôi đã có một chương trình làm việc để tìm ra câu hỏi là gì, nhưng phải mất khá nhiều thời gian để chạy ... – admdrew

Trả lời

18

Các yếu tố cơ bản như sau:

0==0 

Đây là true, có thể bị cưỡng chế để 1.

a >> b 

Toán tử dịch chuyển phải. Trong trường hợp này, nó chỉ được sử dụng ở đầu biểu thức là 0 >> 1 để đánh giá là 0.

a^b 

Bitwise XOR. Cả hai cách sử dụng ở trên đều có a hoặc b0 và do đó kết quả là toán hạng khác 0, bị ép buộc thành một số nguyên.

[a] + [b] 

Chuỗi bổ sung ab, đánh giá để "ab"; nếu cả hai ab là số (ví dụ [0]+[1] kết quả có thể bị cưỡng chế vào một số.

[a] * [b] 

Phép nhân có thể được thực hiện trên mảng yếu tố duy nhất, rõ ràng. Vì vậy, đây là tương đương với a*b.

Cuối cùng,

a << b 

Nhà điều hành trái ca; cho số nguyên dương này nhân lên hiệu quả bằng 2 với công suất b. Trong biểu thức ở trên, điều này được sử dụng với b = 0, do đó kết quả là a, bị ép buộc thành một số nguyên.

Nếu bạn áp dụng đúng thứ tự các hoạt động, bạn sẽ nhận được [2] * [21] đánh giá là 42.

+2

>> đó là nhà điều hành dịch chuyển phải không trái – Givi

+0

@Givi oops typo – Jeremy

+0

@Givi cảm ơn một lần nữa. – Jeremy

11

[(0>>(0==0))+([0]+[(0==0)+(0==0)]^0)]*[(0^[(0==0)+(0==0)]+[0])+((0==0)<<0)] === 42

  • (0>>(0==0))+([0]+[(0==0)+(0==0)]^0) === 2

    • (0>>(0==0)) === 0
      • (0==0) === true
      • (0>>true) === 0 (true ép buộc vào 1)
    • ([0]+[(0==0)+(0==0)]^0) === 2
      • (0==0)+(0==0) === 2
      • [0]+[2] === '02'
      • '02'^0 === 2 ('02' ép buộc vào 2)
  • (0^[(0==0)+(0==0)]+[0])+((0==0)<<0) === 21

    • (0^[(0==0)+(0==0)]+[0]) === 20

      • (0==0)+(0==0) === 2
      • [2]+[0] === '20'
      • 0^'20' === 20 ('20' ép buộc vào 20)
    • ((0==0)<<0) === 1

      • (0==0) === true
      • true<<0 === 1 (true ép buộc vào 1)

Mã này sử dụng ba nhà khai thác nhị phân:

  • >> là Bitwise Ngay Shift với Đăng Hành:

    Nó di chuyển tất cả các bit trong toán hạng đầu tiên của nó sang bên phải bằng số lượng nơi quy định tại các toán hạng thứ hai. Các bit được điền ở bên trái phụ thuộc vào bit dấu của toán hạng ban đầu, để bảo vệ dấu hiệu của kết quả.Nếu toán hạng đầu tiên là dương, kết quả có số 0 được đặt trong các bit cao; nếu toán hạng đầu tiên là âm, kết quả có toán tử được đặt ở các bit cao. Dịch chuyển giá trị sang phải một vị trí tương đương với chia cho 2 (loại bỏ phần còn lại), dịch chuyển hai vị trí tương đương với phân chia số nguyên theo 4 và v.v.

  • << là Bitwise Left Shift với Đăng Hành:

    Nó di chuyển tất cả các bit trong toán hạng đầu tiên của mình sang trái bằng của số nơi quy định tại các toán hạng thứ hai. Các bit mới được điền bằng số không. Chuyển một giá trị trái bằng một vị trí tương đương với nhân với 2, thay đổi hai vị trí tương đương với nhân 4 vv

  • ^ là Bitwise XOR điều hành:

    Nó thực hiện một phép toán OR độc quyền Boolean trên mỗi bit của đối số nguyên số của nó. OR độc quyền có nghĩa là toán hạng một là đúng hoặc toán hạng hai là đúng, nhưng không phải cả hai.

Thông tin về các nhà khai thác nhị phân lấy từ List of all binary operators in JavaScripthttp://www.tutorialspoint.com/javascript/javascript_operators.htm.

Lưu ý rằng toán tử nhị phân cắt ngắn các dấu phẩy động.

+0

Có thể là đáng chú ý là các toán tử dịch chuyển cắt bớt các dấu phẩy động trước khi dịch chuyển. – Jeremy

+0

Bạn có lỗi đánh máy ** 0^'20 '=== 20 (' 02 'bị ép buộc thành 2) ** phải là ** 0^'20' === 20 ('20' bị ép buộc thành 20) ** – Givi

+0

@Givi cố định, cảm ơn – Oriol

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