Chức năng sau đây có thể làm những gì bạn cần:
int isNthBitSet (unsigned char c, int n) {
static unsigned char mask[] = {128, 64, 32, 16, 8, 4, 2, 1};
return ((c & mask[n]) != 0);
}
này giả byte 8-bit (không phải là đưa ra trong C) và các bit 0 là thứ tự cao nhất. Nếu giả định đó không chính xác, nó chỉ đơn giản là đi xuống để mở rộng và/hoặc sắp xếp lại mảng mask
.
Không kiểm tra lỗi được thực hiện vì bạn đã trích dẫn tốc độ là yếu tố quan trọng nhất. Làm không phải chuyển vào một số n
không hợp lệ, đó sẽ là hành vi không xác định.
Ở cấp độ tối ưu hóa điên -O3
, gcc cho chúng ta:
isNthBitSet: pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %eax
movzbl 8(%ebp), %edx
popl %ebp
testb %dl, mask(%eax)
setne %al
movzbl %al, %eax
ret
mask: .byte -128, 64, 32, 16, 8, 4, 2, 1
mà là khá nhỏ và hiệu quả. Và nếu bạn làm cho nó tĩnh và đề xuất nội tuyến, hoặc buộc nội tuyến là định nghĩa macro, bạn thậm chí có thể bỏ qua chi phí của một cuộc gọi hàm.
Chỉ cần đảm bảo bạn đánh giá mọi giải pháp mà bạn được cung cấp, bao gồm giải pháp này (a). Câu thần chú số một trong tối ưu hóa là "Đo lường, đừng đoán!"
Nếu bạn muốn biết cách các toán tử bitwise hoạt động, hãy xem here. Phiên bản AND chỉ đơn giản hóa bên dưới.
Thao tác AND &
sẽ đặt bit chỉ trong mục tiêu nếu cả hai bit được đặt trong nguồn tewo. Bảng có liên quan là:
AND | 0 1
----+----
0 | 0 0
1 | 0 1
Đối với một giá trị char
nhất định, chúng tôi sử dụng các mặt nạ đơn chút chút để kiểm tra xem một chút được thiết lập. Giả sử bạn có giá trị 13 và bạn muốn xem liệu bit thứ ba từ ít quan trọng nhất có được đặt hay không.
Decimal Binary
13 0000 1101
4 0000 0100 (the bitmask for the third-from-least bit).
=========
0000 0100 (the result of the AND operation).
Bạn có thể thấy rằng tất cả các bit không trong mặt nạ dẫn đến các bit kết quả tương đương bằng không. Một bit duy nhất trong mặt nạ về cơ bản sẽ cho bit tương đương trong luồng giá trị thông qua kết quả. Kết quả là 0 nếu bit chúng ta kiểm tra bằng không, hoặc khác 0 nếu nó là một.
Đó là nơi biểu thức trong câu lệnh return
xuất phát từ đó. Các giá trị trong bảng tra cứu mask
là tất cả các mặt nạ đơn-bit:
Decimal Binary
128 1000 0000
64 0100 0000
32 0010 0000
16 0001 0000
8 0000 1000
4 0000 0100
2 0000 0010
1 0000 0001
(a)tôi biết tôi như thế nào tốt, nhưng bạn không :-)
trùng lặp, http://stackoverflow.com/questions/523724/cc-check-if-one-bit-is -set-in-ie-int-variable – blueshift
Đó không phải là một bản dupe, nó được hỏi cụ thể về các phương thức ** non-bitshift **. – paxdiablo