2009-05-04 17 views
12

Tôi đang cố gắng viết một hàm trong assembly (nhưng cho phép giả định ngôn ngữ bất khả tri đối với câu hỏi).Làm cách nào để đặt tất cả các bit thành '1' trong một số nhị phân có kích thước không xác định?

Làm cách nào để sử dụng các toán tử bitwise để đặt tất cả các bit của một số được truyền cho 1?

Tôi biết rằng tôi có thể sử dụng bitwise "hoặc" với mặt nạ có các bit tôi muốn đặt, nhưng tôi không biết cách tạo mặt nạ dựa trên một số nhị phân có kích thước N.

+0

Cài đặt giá trị của số thành "-1" có làm như tôi muốn không? –

+2

Phụ thuộc vào kiến ​​trúc máy. Kiểm tra xem cách -1 được biểu diễn. –

+3

-1 vì cả hai nhận xét trên đều có "-1" trong đó. ... đùa. – bsneeze

Trả lời

48

~ (x & 0)

x & 0 sẽ luôn dẫn đến 0, và ~ sẽ lật tất cả các bit để 1s.

+5

WTF? Tại sao bạn thậm chí cần x? ~ 0 là những gì mà nhọt xuống, mô tả của bạn thậm chí ám chỉ đến nó ("sẽ luôn luôn dẫn đến 0, ..."). – paxdiablo

+14

@Pax: có lẽ vì hằng số 0 có thể là bất kỳ loại số nào. Bao gồm cả x đưa ra một ngữ cảnh (và do đó một kích thước, hoặc quan trọng hơn là đếm bit), tùy thuộc vào trình biên dịch. –

+2

Mẹo rất hay để nhận được loại phù hợp! +1. –

1

Đặt thành -1. Điều này thường được đại diện bởi tất cả các bit là 1.

+3

Điều này đúng với số nguyên _signed_ trong hầu hết các triển khai mà tôi đã nhìn thấy, nhưng ở bên an toàn, tôi có thể sử dụng phương thức bitwise NOT, ví dụ: Sean. – thomasrutter

+0

Bạn cũng không bao giờ nên sử dụng các loại đã ký khi bạn quan tâm đến biểu diễn nhị phân bên trong. – Spookbuster

7

Đặt nó thành 0, sau đó lật tất cả các bit thành 1 bằng bit-NOT.

1

Set x tới 1

Trong khi x < số x = x * 2

trả lời = số hoặc x - 1.

Mã này giả định đầu vào của bạn được gọi là "number". Nó sẽ làm việc tốt cho các giá trị tích cực. Lưu ý đối với các giá trị âm mà là số thập phân bổ sung cho hoạt động không có ý nghĩa vì bit cao sẽ luôn là một.

+0

Đó phải là cách tối ưu hiệu suất tối ưu –

6

Bạn sẽ thấy rằng trong ngôn ngữ assembly bạn để biết kích thước của "số được chuyển". Và trong ngôn ngữ lắp ráp nó thực sự quan trọng mà máy ngôn ngữ lắp ráp là cho.

Với thông tin đó, bạn có thể hỏi hoặc

  • Làm thế nào để thiết lập một số nguyên đăng ký cho tất cả 1 bit?

hoặc

  • Làm thế nào để điền vào một khu vực trong bộ nhớ với tất cả 1 bit?

Để lấp đầy một thanh ghi với tất cả 1 bit, trên hầu hết các máy cách hiệu quả có hai hướng dẫn:

  1. Xóa đăng ký, sử dụng một hướng dẫn mục đích đặc biệt rõ ràng, hoặc tải trực tiếp 0, hoặc xor đăng ký với chính nó.

  2. Lấy phần bổ sung bit của thanh ghi.

Điền nhớ với 1 bit sau đó đòi hỏi phải có 1 hoặc nhiều hướng dẫn cửa hàng ...

Bạn sẽ tìm thấy rất nhiều lời khuyên bit twiddling và thủ thuật trong cuốn sách tuyệt vời Hank Warren của Hacker's Delight.

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