2012-04-05 45 views
9

Vì vậy, tôi thấy rằng câu hỏi này đã được hỏi, tuy nhiên câu trả lời có chút mơ hồ và vô ích. Ok, tôi cần triển khai biểu thức c chỉ sử dụng "&^~! + | >> < "Tuyên bố có điều kiện sử dụng toán tử bitwise

Biểu thức cần giống: a? b: c

Vì vậy, từ những gì tôi đã có thể nói, khái niệm cần phải giống như thế:

return (a & b) | (~a & c)

này hoạt động khi a = 0, vì anding nó với b sẽ cung cấp cho không, và sau đó biểu thức hoặc sẽ trả về phía bên phải, (~a & c) hoạt động vì ~ 0 cung cấp tất cả những cái, và anding c với tất cả đều trả về c.

Tuy nhiên, điều này không hoạt động khi có> 0. Ai đó có thể cố gắng giải thích tại sao điều này xảy ra hoặc cách khắc phục?

Trả lời

15

Tôi sẽ chuyển đổi a thành boolean bằng cách sử dụng !!a, để nhận 0 hoặc 1. x = !!a.

Sau đó, tôi sẽ phủ nhận điều đó trong phần bổ sung của hai. Vì bạn không có số nguyên âm sẵn có, bạn sử dụng định nghĩa về từ chối bổ sung của 2: đảo ngược các bit, sau đó thêm một số: y = ~x + 1. Điều đó sẽ cung cấp cho tất cả các bit rõ ràng, hoặc tất cả các bit thiết lập.

Sau đó, tôi muốn and trực tiếp với một biến y & b, nghịch đảo của nó với biến số khác: ~y & c. Điều đó sẽ cho một 0 cho một trong các biểu thức, và biến ban đầu cho các biểu thức khác. Khi chúng tôi or những thứ đó lại với nhau, số không sẽ không có hiệu lực, vì vậy chúng tôi sẽ nhận được biến ban đầu, không thay đổi.

+0

Điều này thực sự hoàn hảo. Vì vậy, tại sao thêm một làm cho tất cả các bit thiết lập hoặc rõ ràng? Tôi hiểu tại sao điều đó lại xảy ra, nhưng tôi không hiểu điều đó xảy ra như thế nào. – atb

+0

Nếu chúng ta bắt đầu với 0, sau đó lật các bit cho tất cả các bit. Khi chúng ta thêm một, tất cả những người quay trở lại số không (và mang được thiết lập, nhưng chúng tôi bỏ qua nó). Nếu chúng ta bắt đầu với 1, lật các bit cho 111 ... 10. Thêm 1 lượt mà cuối cùng 0 đến 1, vì vậy tất cả các bit bây giờ là 1. –

+0

phần 'y = ~ x + 1' khiến tôi bối rối; Tôi cuối cùng đã tìm ra nó hoạt động do tràn số nguyên trong trường hợp khi x = 0, nhưng nó không rõ ràng. Giải pháp rõ ràng hơn cho tôi trước tiên là chuyển từ lsb sang msb bằng shift trái (00000001 => 10000000) và sau đó sao chép msb với shift phải: 'y = (x << 31) >> 31' –

3

Nói cách khác, bạn cần a có tất cả các bit đặt thành 0, nếu a là false (ví dụ: 0), và có tất cả các bit đặt là 1, nếu a là đúng (ví dụ: a > 0).

Đối với trường hợp cũ, công việc đã được thực hiện cho bạn; cho sau này - cố gắng tìm ra kết quả của biểu thức ~!1.

+0

cũng đúng như tôi nghĩ lúc đầu. ~ 1 sẽ cho tất cả những cái hoàn hảo. Tuy nhiên, nếu tôi đã làm ~! A, và a = 0, thì ~! 0 sẽ cho tôi 1110, vì vậy tôi không chắc phải làm gì ở đây /: – atb

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