2010-08-11 19 views
10

Tôi cố gắng để lấy của một người bổ sung từ 0 đến tặng 1 nhưng tôi nhận 4294967295. Đây là những gì tôi đã làm:đầu ra Weird cho Bitwise NOT

unsigned int x = 0; 
unsigned int y= ~x; 
cout << y; 

đầu ra của tôi là 4294967295 nhưng tôi hy vọng 1, tại sao thế này ?. Nhân tiện, tôi đang làm điều này trong C++.

+0

bổ sung 1s phụ thuộc vào số bit trong điều bạn đang tìm kiếm phần bổ sung. Các tính năng xác định bổ sung của một người là bạn có hai con số cả hai đều bằng không. Thao tác phủ định trong phần bổ sung 1s tương đương với toán tử bitwise không như bạn đã quan sát. Tôi nghĩ rằng bạn có một ý tưởng sai lầm về cách bổ sung 1s hoạt động. – Omnifarious

Trả lời

21

Tại sao bạn mong đợi 1? Bit-wise bổ sung flips tất cả các bit.

00000000000000000000000000000000 = 0 
       | 
      bitwise NOT 
       | 
       v 
11111111111111111111111111111111 = 4294967295 

Có lẽ bạn đang nghĩ đến một số logical NOT. Trong C++, điều này được viết là !x.

0

Số nguyên nhiều hơn 1 bit (là 4 byte hoặc 32 bit). Bằng cách ghi nhận nó, you'r lật tất cả mọi thứ, vì vậy trong trường hợp này 00000 ... trở thành 11111 ...

0

~ lật tất cả các bit vào đầu vào. Đầu vào của bạn là một int không dấu, trong đó có 32 bit, tất cả đều là 0. Lật từng bit 0 cung cấp cho bạn 32 bit 1, là số nhị phân cho số lớn đó.

Nếu bạn chỉ muốn lật bit ít quan trọng nhất, bạn có thể sử dụng y = x^1 - tức là, sử dụng XOR thay thế.

2

Bạn nhận được kỳ vọng 1 từ đâu?

hiểu biết của bạn về các hoạt động Bitwise rõ ràng cho thấy thiếu, nó sẽ là khôn ngoan để làm việc qua chúng đầu tiên trước khi gửi bài ở đây ...

bạn đang không gây nhầm lẫn với một ! là một NOT hợp lý, phải không?

một ~ Bitwise bổ sung hoặc một Bitwise NOT hoạt động flips tất cả các bit 1-0 và ngược lại tùy thuộc vào nơi ở bitmask được thiết lập, ví dụ như vậy, 1 là

 
00000000 00000000 00000000 00000001 

làm một ~ Bitwise NOT vào đó flips nó để

 
11111111 11111111 11111111 11111110 

mang đến cho bạn những giá trị tối đa ít 1 của datatype nguyên trên hệ thống 32bit.

Đây là một liên kết xứng đáng với điều này cho bạn thấy cách thực hiện bit-twiddling tại đây.

4

Bạn phải xem xét điều này trong dạng nhị phân để hiểu chính xác những gì đang xảy ra.

unsigned int x = 0, là 00000000 00000000 00000000 00000000 trong bộ nhớ.

Các ~x tuyên bố flips tất cả các bit, có nghĩa là thay phiên nhau trên vào:

11111111 11111111 11111111 11111111

mà chuyển đến 4294967295 dưới dạng số thập phân.

XOR sẽ cho phép bạn chỉ lật các bit nhất định. Nếu bạn chỉ muốn lật bit ít quan trọng nhất, hãy sử dụng x^1 để thay thế.

0

Bạn có thể sử dụng

unsigned int y= !x; 

để có được y = 1;