2011-08-18 71 views
5

Tôi cần lấy bit thứ n của một số nguyên, hoặc đã ký hoặc chưa ký, trong Ruby.bit trích xuất trong số nguyên Ruby

x = 123 # that is 1111011 
n = 2 # bit 2 is ...0 

Các đoạn mã sau đây không hoạt động trong trường hợp chung:

x.to_s(2)[-(n+1)] #0 good! but... 

vì số âm không thể hiện dưới dạng 2-bổ sung:

-123.to_s(2) # "-1111011" 

Vậy làm thế nào để tiếp tục ?

Trả lời

12
x = 123 # that is 1111011 
n = 2 # bit 2 is ...0 

x[n] # => 0 

-123[2] # => 1 
+0

kết quả 1 và 0 bị đảo ngược. Tôi đã cố chỉnh sửa bài đăng của bạn mà không thành công – JCLL

+0

@JCLL: Cảm ơn! Đó là một trường hợp cắt và dán sẽ thực sự có * ngăn chặn * một lỗi :-) –

+4

Heh, nhưng một nhà điều hành Ruby mát mẻ: [] trên Fixnum, bằng cách nào đó cả hai đồng bằng như ngày trong các tài liệu chưa được chôn cất ra khỏi tầm nhìn cùng một lúc. – DigitalRoss

4
def f x, bit 
    (x & 1 << bit) > 0 ? 1 : 0 
end 
+0

Và nếu bạn chỉ muốn có kết quả đúng/sai, bạn có thể bỏ qua '? 1: 0' – DigitalRoss

3

Bạn có thể thử Bindata lib.

Có một hàm đại diện cho biểu diễn nhị phân của một số nguyên là một chuỗi và sau đó, bạn có thể làm những gì bạn thích với nó.

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