Có ai giúp được n&-n
nghĩa là gì không ?? Và ý nghĩa của nó là gì.Ý nghĩa của bitwise và (&) của một số dương và âm?
Trả lời
Tôi tin rằng đó là một mẹo để tìm ra nếu n là một sức mạnh của 2. (n == (n & -n)) IFF n là công suất 2 (1,2,4,8).
Điều đó không hoàn toàn hoạt động vì nó sẽ trả về true cho số không, thường không được coi là sức mạnh của hai. Và mẹo này hữu ích hơn thế - xem các câu trả lời khác. – JasonD
'(n & (n-1)) == 0' sẽ đơn giản hơn. –
Trên khá nhiều hệ thống mà hầu hết mọi người thực sự quan tâm, nó sẽ cung cấp cho bạn sức mạnh cao nhất của 2 mà n là chia hết cho.
nhưng hãy cẩn thận rằng nó phụ thuộc vào hành vi được xác định thực hiện, vì vậy kỹ thuật không thể di chuyển được. – tletnes
@tletnes Tính di động là một thuật ngữ tương đối. Nó không di động xa như tiêu chuẩn C++ là có liên quan, đúng sự thật. Nhưng nó có thể di động trên nhiều hệ thống hơn thậm chí có một trình biên dịch C++ phù hợp hoặc gần như tuân thủ –
Nó chỉ là một bitwise-và của số. Số âm được biểu thị là two's complement.
Vì vậy, ví dụ, Bitwise và 7 & (-7) là x00000111 & x11111001 = x00000001 = 1
Đây là một thủ thuật cũ mà đưa ra một số với một chút duy nhất trong nó, các bit đáy được thiết lập trong số n
. Ít nhất trong số học bổ sung của hai, mà chỉ là về phổ quát những ngày này.
Lý do hoạt động: số âm của một số được tạo bằng cách đảo ngược số, sau đó thêm 1 (đó là định nghĩa của phần bổ sung của hai). Khi bạn thêm 1, mỗi bit bắt đầu ở phía dưới được đặt sẽ tràn vào bit cao hơn tiếp theo; điều này dừng lại khi bạn đạt đến một bit không. Tất cả các bit tràn này sẽ là 0, và các bit phía trên ảnh bị ảnh hưởng cuối cùng sẽ là nghịch đảo của nhau, vì vậy bit duy nhất còn lại là bit đã dừng lại thác - số bắt đầu bằng 1 và được đảo ngược thành 0.
PS Nếu bạn đang lo lắng về việc chạy qua một số học của bổ sung đây là một phiên bản làm việc với cả hai:
n & (~n + 1)
Có, và điều đó rất hữu ích nếu ví dụ: người ta muốn nhanh chóng lặp qua tất cả các bit được đặt trong n; 'for (; j = n &(-n); n^= j)' –
Như @aestrivex đã đề cập, nó là một cách viết 1.Even tôi gặp phải điều này
for (int y = x; y > 0; y -= y & -y)
và nó chỉ có nghĩa là y = y-1 vì
(-7) là x00000111 & x11111001 = x00000001 = 1
tôi sẽ thêm một ví dụ tự giải thích với 0.123.457 Triển lãm tuyệt vời của.
010010000 | +144 ~
----------|-------
101101111 | -145 +
1 |
----------|-------
101110000 | -144
101110000 | -144 &
010010000 | +144
----------|-------
000010000 | 16`
Vì x & -x = {0, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 16, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 32}
cho x
từ 0 đến 32. Nó được sử dụng để tăng vọt trong cho trình tự do cho một số ứng dụng. Các ứng dụng có thể lưu trữ các bản ghi tích lũy.
for(;x < N;x += x&-x) {
// do something here
++tr[x];
}
Vòng lặp lướt qua rất nhanh vì nó tìm kiếm lũy thừa tiếp theo để nhảy.
- 1. Làm cách nào để tách số dương và số âm thành cột riêng của chúng?
- 2. Kiểm tra xem một số có dương hay âm bằng cách sử dụng toán tử bitwise
- 3. Ý nghĩa của PID, PPID và TGID
- 4. cách thay đổi số dương sang âm và ngược lại?
- 5. ý nghĩa của "tham chiếu" và "dereferencing"
- 6. ý nghĩa của (số) & (-number)
- 7. Số kết nối mở và ý nghĩa của tình trạng ngủ của một kết nối
- 8. Chức năng toán học Java để chuyển đổi int dương sang âm và âm sang dương?
- 9. ý nghĩa của các giá trị âm của loại char trong C
- 10. Ý nghĩa của một số hằng số Paint trong Android
- 11. Ý nghĩa của main_syntax
- 12. Ý nghĩa của * args và ** kwargs là gì?
- 13. Ý nghĩa của mở băm và Closed băm
- 14. Ý nghĩa của '&' và '!' trước tên thuộc tính?
- 15. nhầm lẫn về khoảng trống và ý nghĩa của nó.
- 16. std :: type_info :: hash_code() duy nhất và ý nghĩa của "nên"
- 17. Ý nghĩa của dấu ngoặc đơn trong C++ và C
- 18. Tại sao bitwise OR toán tử được sử dụng trong cờ enum với ý nghĩa VÀ
- 19. ý nghĩa của 'sourceSets.all *'
- 20. Ý nghĩa của .this và .class trong java
- 21. Ý nghĩa của $ (OutDir)
- 22. Ý nghĩa của []
- 23. Ý nghĩa của ulimit Hard (-H) và Soft (-S)
- 24. Chuyển đổi một số dương sang âm trong C#
- 25. ASP.NET ý nghĩa của AutoEventWireup và Inherits là gì?
- 26. Ý nghĩa của Spring @ManagerResource: persistPolicy, persistPeriod, persistLocation và currencyTimeLimit
- 27. Ý nghĩa của Y2K có ý nghĩa gì?
- 28. ARC - Ý nghĩa của __unsafe_unretained?
- 29. ý nghĩa của @ ký tự (#)
- 30. tối ưu hóa gcc? lỗi? và ý nghĩa dụng thiết thực của nó để dự
Nó có thể gây ra hành vi không xác định hoặc đơn giản là kết quả trong giá trị không xác định và/hoặc thực hiện tùy thuộc vào giá trị 'n' và biểu diễn số âm (phần bổ sung của 1 so với phần bù 2). Tôi chắc chắn đó là điều bạn không muốn sử dụng/gặp phải. –
Tôi chưa bao giờ thấy máy bổ sung thực sự của 1. –
@Cthulhu, tôi có nhưng đã rất lâu rồi. C + + chưa được phát minh. –