2013-03-13 29 views
5

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?

+2

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. –

+0

Tôi chưa bao giờ thấy máy bổ sung thực sự của 1. –

+1

@Cthulhu, tôi có nhưng đã rất lâu rồi. C + + chưa được phát minh. –

Trả lời

0

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).

+1

Đ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

+0

'(n & (n-1)) == 0' sẽ đơn giản hơn. –

3

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.

+0

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

+3

@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ủ –

1

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

14

Đâ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) 
+0

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)' –

-2

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

0

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` 
0

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.

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