উত্তর:
সি তে, আপনি যদি বিট ম্যানিপুলেশনটি গোপন করতে চান তবে আপনি ম্যাক্রো লিখতে পারেন:
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
এবং ডান প্রান্ত থেকে n তম বিট পরীক্ষা করতে এটি এইভাবে ব্যবহার করুন :
CHECK_BIT(temp, n - 1)
সি ++ এ আপনি স্ট্যান্ড :: বিটসেট ব্যবহার করতে পারেন ।
!= 0
কিছু সত্য, তবে কেন বিরক্ত করবেন? 1
ঠিক যেমন সত্য 0.1415
!
std::bitset
সত্যি? অবশ্যই, একক বিট পরীক্ষা করার জন্য খুব সামান্য কাজ (এবং সম্ভাব্য কয়েকটি সত্যিই দুর্দান্ত টেম্পলেট) না করে, একটি ফোলা পাত্রে ব্যবহার করুন যা অন্যথায় অব্যবহৃত প্রতিটি 'বিট' সংরক্ষণ করে (আমার বাস্তবায়নে) unsigned long
। কী জায়গার অপচয়!
বিট এন (0 থেকে শুরু) সেট করা আছে কিনা তা পরীক্ষা করুন:
temp & (1 << N)
এটির জন্য কোনও বিল্টিন ফাংশন নেই।
1 << 0
?? দুঃখিত, বিভ্রান্ত
1<<0
কোনও শিফট ছাড়াই 1 (শিফট 0), যা1<<0 == 1
আমি মাত্র একটি স্টাডি :: বিটসেট ব্যবহার করব যদি এটি সি ++ হয়। সহজ। সোজা সম্মুখগামী। বোকা ত্রুটির কোনও সুযোগ নেই।
typedef std::bitset<sizeof(int)> IntBits;
bool is_set = IntBits(value).test(position);
বা এই নির্বিকারতা সম্পর্কে কি
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)>
আরও বেশি সঠিক হতে হবে
হ্যাঁ, আমি জানি আমি এইভাবে " করণীয় " করব না । তবে আমি সাধারণত লিখি:
/* 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); }
উদাহরণ:
IsBitSet( foo, BIT(3) | BIT(6) ); // Checks if Bit 3 OR 6 is set.
অন্যান্য বিষয়ের মধ্যে, এই পদ্ধতির:
নির্বাচিত উত্তরটি যা করছে তা আসলে ভুল। নীচের ফাংশনটি বিট অবস্থানটি 0 বা ফিরে আসবে যদি বিটটি আসলে সক্ষম করা থাকে তার উপর নির্ভর করে। পোস্টারটি যা চেয়েছিল এটি এটি নয়।
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
পোস্টারটি মূলত যা খুঁজছিল তা এখানে। বিট সক্ষম থাকলে এবং অবস্থানটি না থাকলে নীচের ফাংশনটি 1 বা 0 প্রদান করবে।
#define CHECK_BIT(var,pos) (((var)>>(pos)) & 1)
bool has_feature = CHECK_BIT(register, 25);
ডাবল-নেগেট ছাড়াই এটি করতে পারি জেনে রাখা ভাল এর মতো ব্যবহার করার সময় আমি ঠিক এটির সমস্যার মুখোমুখি হয়েছি ।
বিট-ফিল্ডগুলির এই বর্ণনা অনুসারে , সরাসরি ক্ষেত্রগুলি সংজ্ঞায়িত এবং অ্যাক্সেসের জন্য একটি পদ্ধতি রয়েছে। এই এন্ট্রি উদাহরণটি যায়:
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)
/* ... */
এছাড়াও, সেখানে একটি সতর্কতা রয়েছে:
তবে স্ট্রটে বিট সদস্যদের ব্যবহারিক ঘাটতি রয়েছে। প্রথমত, মেমরিতে বিটের ক্রম হ'ল আর্কিটেকচার নির্ভর এবং মেমরি প্যাডিং বিধিগুলি সংকলক থেকে সংকলক পর্যন্ত পরিবর্তিত হয়। এছাড়াও, অনেক জনপ্রিয় সংকলক বিট সদস্যদের পড়ার জন্য এবং লেখার জন্য অযোগ্য কোড তৈরি করে এবং বিট ক্ষেত্রগুলি সম্পর্কিত বিশেষত গুরুতর থ্রেড সুরক্ষা সমস্যা রয়েছে (বিশেষত মাল্টিপ্রসেসর সিস্টেমে) বেশিরভাগ মেশিনগুলি মেমরির বিটগুলির স্বেচ্ছাসেবক সেটগুলি পরিচালনা করতে পারে না বলে, তবে এর পরিবর্তে পুরো শব্দ লোড এবং সংরক্ষণ করতে হবে।
আপনি একটি বিটসেট ব্যবহার করতে পারেন - http://www.cppreferences.com/wiki/stl/bitset/start ।
Std :: বিটসেট ব্যবহার করুন
#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
"বিগ-এন্ডিয়ান" হিসাবে প্রতিফলিত করার দরকার নেই?
নেই, যথা _bittest স্বকীয় নির্দেশ।
আমি এটি ব্যবহার:
#define CHECK_BIT(var,pos) ( (((var) & (pos)) > 0 ) ? (1) : (0) )
যেখানে "পজ" 2 ^ n হিসাবে নির্ধারিত হয়েছে (আইজি 1,2,4,8,16,32 ...)
রিটার্ন দেয়: 1 টি সত্য হলে 0 টি মিথ্যা হলে
4 = 2^(3-1)
বিট পজিশন 3 ব্যবহারের জন্য স্পষ্টভাবে বলতে হবে কারণ এটি প্রশ্নের অংশ ছিল।
আমি একটি 32-বিট পূর্ণসংখ্যা পড়ার চেষ্টা করছিলাম যা পিডিএফগুলিতে কোনও বস্তুর পতাকা চিহ্নিত করেছিল এবং এটি আমার পক্ষে কাজ করছে না
এটি সংজ্ঞায়িত করে কী পরিবর্তন করছিল:
#define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))
অপারেন্ড এবং & তে উভয় যে পতাকা রয়েছে তার সাথে একটি পূর্ণসংখ্যা ফেরত দেয় এবং এটি বুলিয়ানে সঠিকভাবে কাস্টিং করা হয়নি, এই কৌশলটি করেছিল
!= 0
একই কাজ করবে। জেনারেট হওয়া মেশিনের নির্দেশাবলী কীভাবে আলাদা হতে পারে তা জানেন না।
আপনি স্থানান্তর এবং মাস্কিংকে "অনুকরণ" করতে পারেন: যদি (0x5e / (2 * 2 * 2))% 2) ...
এত সহজ কিছু কেন ব্যবহার করবেন না?
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";
}
}
আউটপুট: বাইনারি: 11111111
std::cout << (((status & (1 << i)) ? '1' : '0');
। 8 বিটকে হার্ড কোডিংয়ের পরিবর্তে আপনার CHAR_BIT
ধ্রুবকটি ব্যবহার করা উচিত <climits>
, যদিও আপনি জানেন যে ফলটি যাইহোক 8 হবে আপনি যেহেতু একটি ব্যবহার করছেনuint8_t
আপনি যদি কেবল একটি আসল হার্ড কোডেড উপায় চান:
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
এই এইচডব্লিউ নির্ভরশীল নোট করুন এবং এই বিট অর্ডারটি 7654 3210 ধরে এবং ভেরটি 8 বিট হিসাবে ধরেছে।
#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;
}
ফলাফল স্বরূপ:
1 0 1 0
এখনই উত্তর দিতে দেরি হয়ে গেলেও, এনটি বিট সেট করা আছে কিনা সে সম্পর্কে সহজ উপায় খুঁজে পাওয়া যায়, কেবল শক্তি এবং মডেলাস গাণিতিক অপারেটর ব্যবহার করে।
আসুন আমরা বলি যে আমরা জানতে চাই যে 'টেম্প' এর এনথ বিট সেট আছে কি না। অন্যথায় 0 বিট সেট করা থাকলে নীচের বুলিয়ান এক্সপ্রেশনটি সত্য দেয়।
নিম্নলিখিত উদাহরণ বিবেচনা করুন:
যদি আমি জানতে চাই যে ২ য় বিট সেট করা আছে কি না, আমি পাই
সুতরাং এক্সপ্রেশন সত্য ফিরে আসে, তৃতীয় বিট সেট করা ইঙ্গিত করে।
একটি পদ্ধতির নিম্নলিখিত শর্তের মধ্যে পরীক্ষা করা হবে:
if ( (mask >> bit ) & 1)
একটি ব্যাখ্যা প্রোগ্রাম হবে:
#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;
}
}
আউটপুট:
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)
পোস্ট - বিট পজিশন থেকে 0।
0 বা 1 প্রদান করে।
আমি এটি তৈরি:
LATGbits.LATG0 = ((M & 0x8)> 0); // মিটের বিট -2 1 হয় কিনা তা পরীক্ষা করতে