Câu trả lời:
Trong C, nếu bạn muốn ẩn thao tác bit, bạn có thể viết macro:
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
và sử dụng nó theo cách này để kiểm tra bit thứ n từ đầu bên phải:
CHECK_BIT(temp, n - 1)
Trong C ++, bạn có thể sử dụng std :: bitset .
!= 0
đúng, vậy tại sao phải bận tâm? 1
là chính xác như sự thật 0.1415
!
std::bitset
, thật không? Chắc chắn, thay vì thực hiện một chút công việc nhỏ (và có khả năng là một số mẫu thực sự đẹp) để kiểm tra một chút, hãy sử dụng một bộ chứa cồng kềnh lưu trữ (trong phần triển khai của tôi) từng 'bit' trong một không sử dụng unsigned long
. Thật là lãng phí không gian!
Kiểm tra xem bit N (bắt đầu từ 0) đã được đặt chưa:
temp & (1 << N)
Không có chức năng nội trang cho việc này.
1 << 0
?? Xin lỗi, nhầm lẫn.
1<<0
, tức là số 1 không có bất kỳ sự thay đổi nào (ca 0), đó là1<<0 == 1
Tôi sẽ chỉ sử dụng std :: bitset nếu đó là C ++. Đơn giản. Nói thẳng. Không có cơ hội cho những lỗi ngu ngốc.
typedef std::bitset<sizeof(int)> IntBits;
bool is_set = IntBits(value).test(position);
hoặc làm thế nào về sự ngốc nghếch này
template<unsigned int Exp>
struct pow_2 {
static const unsigned int value = 2 * pow_2<Exp-1>::value;
};
template<>
struct pow_2<0> {
static const unsigned int value = 1;
};
template<unsigned int Pos>
bool is_bit_set(unsigned int value)
{
return (value & pow_2<Pos>::value) != 0;
}
bool result = is_bit_set<2>(value);
std::bitset<CHAR_BIT * sizeof(int)>
thậm chí còn đúng hơn
Vâng, tôi biết tôi không "phải" làm theo cách này. Nhưng tôi thường viết:
/* Return type (8/16/32/64 int size) is specified by argument size. */
template<class TYPE> inline TYPE BIT(const TYPE & x)
{ return TYPE(1) << x; }
template<class TYPE> inline bool IsBitSet(const TYPE & x, const TYPE & y)
{ return 0 != (x & y); }
Ví dụ:
IsBitSet( foo, BIT(3) | BIT(6) ); // Checks if Bit 3 OR 6 is set.
Trong số những thứ khác, cách tiếp cận này:
Những gì câu trả lời đã chọn đang làm thực sự là sai. Hàm dưới đây sẽ trả về vị trí bit hoặc 0 tùy thuộc vào việc bit có thực sự được bật hay không. Đây không phải là những gì người đăng yêu cầu.
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
Đây là những gì người đăng ban đầu đang tìm kiếm. Hàm dưới đây sẽ trả về 1 hoặc 0 nếu bit được bật chứ không phải vị trí.
#define CHECK_BIT(var,pos) (((var)>>(pos)) & 1)
bool has_feature = CHECK_BIT(register, 25);
Good to know Tôi có thể làm điều đó mà không cần phủ nhận kép.
Theo mô tả này về trường bit , có một phương pháp để xác định và truy cập trực tiếp các trường. Ví dụ trong mục này là:
struct preferences {
unsigned int likes_ice_cream : 1;
unsigned int plays_golf : 1;
unsigned int watches_tv : 1;
unsigned int reads_books : 1;
};
struct preferences fred;
fred.likes_ice_cream = 1;
fred.plays_golf = 1;
fred.watches_tv = 1;
fred.reads_books = 0;
if (fred.likes_ice_cream == 1)
/* ... */
Ngoài ra, có một cảnh báo ở đó:
Tuy nhiên, các thành viên bit trong cấu trúc có những hạn chế thực tế. Đầu tiên, thứ tự các bit trong bộ nhớ phụ thuộc vào kiến trúc và các quy tắc đệm bộ nhớ khác nhau giữa các trình biên dịch. Ngoài ra, nhiều trình biên dịch phổ biến tạo ra mã không hiệu quả để đọc và ghi các thành viên bit và có khả năng xảy ra các vấn đề nghiêm trọng về an toàn luồng liên quan đến các trường bit (đặc biệt là trên các hệ thống đa xử lý) do hầu hết các máy không thể thao tác các bộ bit tùy ý trong bộ nhớ, nhưng thay vào đó phải tải và lưu trữ toàn bộ từ.
Bạn có thể sử dụng Bitset - http://www.cppreference.com/wiki/stl/bitset/start .
Sử dụng std :: bitset
#include <bitset>
#include <iostream>
int main()
{
int temp = 0x5E;
std::bitset<sizeof(int)*CHAR_BITS> bits(temp);
// 0 -> bit 1
// 2 -> bit 3
std::cout << bits[2] << std::endl;
}
temp
cần phải được phản ánh để làm cho nó trở thành "big-endian"?
Có, cụ thể là hướng dẫn nội tại _bittest .
Tôi sử dụng cái này:
#define CHECK_BIT(var,pos) ( (((var) & (pos)) > 0 ) ? (1) : (0) )
trong đó "pos" được định nghĩa là 2 ^ n (tức là 1,2,4,8,16,32 ...)
Trả về: 1 nếu đúng 0 nếu sai
4 = 2^(3-1)
cho vị trí bit 3 vì nó là một phần của câu hỏi.
tôi đang cố đọc một số nguyên 32 bit xác định các cờ cho một đối tượng trong tệp PDF và điều này không hiệu quả với tôi
điều gì đã sửa nó đã thay đổi định nghĩa:
#define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))
toán hạng & trả về một số nguyên với các cờ đều có trong 1 và nó không được truyền đúng cách thành boolean, điều này đã thực hiện một mẹo nhỏ
!= 0
cũng sẽ làm như vậy. Không biết các hướng dẫn máy đã tạo có thể khác nhau như thế nào.
Bạn có thể "mô phỏng" dịch chuyển và che: if ((0x5e / (2 * 2 * 2))% 2) ...
Tại sao không sử dụng một cái gì đó đơn giản như thế này?
uint8_t status = 255;
cout << "binary: ";
for (int i=((sizeof(status)*8)-1); i>-1; i--)
{
if ((status & (1 << i)))
{
cout << "1";
}
else
{
cout << "0";
}
}
ĐẦU RA: nhị phân: 11111111
std::cout << (((status & (1 << i)) ? '1' : '0');
. Bạn nên sử dụng CHAR_BIT
liên tục từ <climits>
thay vì cứng mã hóa 8 bit, mặc dù trong trường hợp này bạn biết kết quả sẽ là 8 nào kể từ khi bạn đang sử dụng mộtuint8_t
nếu bạn chỉ muốn một cách mã hóa cứng thực sự:
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
lưu ý điều này phụ thuộc vào hw và giả sử thứ tự bit này 7654 3210 và var là 8 bit.
#include "stdafx.h"
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
int _tmain(int argc, _TCHAR* argv[])
{
int temp =0x5E;
printf(" %d \n", IS_BIT3_SET(temp));
temp = 0x00;
printf(" %d \n", IS_BIT3_SET(temp));
temp = 0x04;
printf(" %d \n", IS_BIT3_SET(temp));
temp = 0xfb;
printf(" %d \n", IS_BIT3_SET(temp));
scanf("waitng %d",&temp);
return 0;
}
Kết quả trong:
1 0 1 0
Mặc dù bây giờ đã khá muộn để trả lời, nhưng có một cách đơn giản mà người ta có thể tìm xem bit thứ N có được đặt hay không, chỉ cần sử dụng các toán tử toán học POWER và MODULUS.
Giả sử chúng tôi muốn biết liệu 'temp' có đặt bit thứ N hay không. Biểu thức boolean sau sẽ cho true nếu bit được đặt, ngược lại là 0.
Hãy xem xét ví dụ sau:
Nếu tôi muốn biết liệu bit thứ 3 có được đặt hay không, tôi nhận được
Vì vậy, biểu thức trả về true, cho biết bit thứ 3 được thiết lập.
Một cách tiếp cận sẽ được kiểm tra trong điều kiện sau:
if ( (mask >> bit ) & 1)
Một chương trình giải thích sẽ là:
#include <stdio.h>
unsigned int bitCheck(unsigned int mask, int pin);
int main(void){
unsigned int mask = 6; // 6 = 0110
int pin0 = 0;
int pin1 = 1;
int pin2 = 2;
int pin3 = 3;
unsigned int bit0= bitCheck( mask, pin0);
unsigned int bit1= bitCheck( mask, pin1);
unsigned int bit2= bitCheck( mask, pin2);
unsigned int bit3= bitCheck( mask, pin3);
printf("Mask = %d ==>> 0110\n", mask);
if ( bit0 == 1 ){
printf("Pin %d is Set\n", pin0);
}else{
printf("Pin %d is not Set\n", pin0);
}
if ( bit1 == 1 ){
printf("Pin %d is Set\n", pin1);
}else{
printf("Pin %d is not Set\n", pin1);
}
if ( bit2 == 1 ){
printf("Pin %d is Set\n", pin2);
}else{
printf("Pin %d is not Set\n", pin2);
}
if ( bit3 == 1 ){
printf("Pin %d is Set\n", pin3);
}else{
printf("Pin %d is not Set\n", pin3);
}
}
unsigned int bitCheck(unsigned int mask, int bit){
if ( (mask >> bit ) & 1){
return 1;
}else{
return 0;
}
}
Đầu ra:
Mask = 6 ==>> 0110 Pin 0 is not Set Pin 1 is Set Pin 2 is Set Pin 3 is not Set
#define CHECK_BIT(var,pos) ((var>>pos) & 1)
pos - Phân tầng vị trí bit từ 0.
trả về 0 hoặc 1.
Tôi làm nó:
LATGbits.LATG0 = ((m & 0x8)> 0); // để kiểm tra xem bit-2 của m có phải là 1 hay không