2010-03-12 21 views
48

यह जांचने के लिए कि बाइट में कोई निश्चित बिट सेट है या नहीं?जांच रहा है कि कोई बिट सेट है या नहीं

bool IsBitSet(Byte b,byte nPos) 
{ 
    return .....; 
} 
+0

आपका अंतिम पाठ टेक्स्ट का कोई अर्थ नहीं है। – leppie

+9

यह होमवर्क समस्या की तरह लगता है लेकिन लगता है कि इस कोड स्निपसेट से कितने लोग लाभ प्राप्त करते हैं .. – Manjoor

+1

मैं इसे अपने काम पर उपयोग कर रहा हूं। वह संघर्ष वास्तविक है। – cambunctious

उत्तर

116

लगता है होमवर्क की तरह एक सा है, लेकिन:

bool IsBitSet(byte b, int pos) 
{ 
    return (b & (1 << pos)) != 0; 
} 

स्थिति 0 कम से कम महत्वपूर्ण बिट है, स्थिति 7 सबसे अधिक है।

+32

अभी तक एक और लाइनर मैं हमेशा इसे सीखने के बजाय Google के लिए Google :) – grapkulec

5

यहां शब्दों में समाधान है।

प्रारंभिक मान 1 एन बार के साथ एक पूर्णांक को बाएं स्थानांतरित करें और फिर मूल बाइट के साथ एक और करें। यदि परिणाम शून्य नहीं है, तो बिट अन्यथा सेट नहीं है। :)

+0

ठीक है। 3 का बाइट, परीक्षण करें कि बिट 1 सेट है। तो 1 << 1 है 2. 2 और 3 सत्य नहीं है। असमर्थ रहे हैं। – spender

+1

@ स्पेंडर: गलती, निश्चित रूप से 2 और 3 2 है (बाइनरी 10 और 11 = 10 में) जो शून्य नहीं है और इसलिए एक वास्तविक परिणाम है। ठीक है, सी # आपको ऐसा नहीं करने देता है जैसे सी/सी ++ करता है तो आपको एक! = 0 परीक्षण की आवश्यकता होगी। – Skizz

+0

शायद चेक गैर-शून्य के लिए होना चाहिए? afaik, शून्य शून्य सच नहीं है। – spender

3

अधिकार अपने इनपुट शिफ्ट n नीचे बिट्स और 1 के साथ मुखौटा है, तो परीक्षण करते हैं कि आप 0 या 1.

+0

मैं इस तरह से भी पसंद करता हूं, बाएं स्थानांतरित करना बस इतना अप्राकृतिक लगता है :) – leppie

5

यह भी काम करता है (.NET 4 में परीक्षण किया है):

void Main() 
{ 
    //0x05 = 101b 
    Console.WriteLine(IsBitSet(0x05, 0)); //True 
    Console.WriteLine(IsBitSet(0x05, 1)); //False 
    Console.WriteLine(IsBitSet(0x05, 2)); //True 
} 

bool IsBitSet(byte b, byte nPos){ 
    return new BitArray(new[]{b})[nPos]; 
} 
+5

यदि आप थोड़ा झुकाव कर रहे हैं, तो आप शायद प्रदर्शन के बाद हो। इस तरह से ऐसा करने से अधिक ओओ महसूस हो सकता है, लेकिन यह perf को मारने जा रहा है। –

+0

मैं आपको या कुछ भी कम करने वाला नहीं हूं लेकिन यदि आप प्रदर्शन की तलाश में हैं तो आपको यह नहीं करना चाहिए। – Gaspa79

0

एक 16-बिट शब्द में बिट्स की जाँच करने के लिए:

Int16 WordVal = 16; 
    for (int i = 0; i < 15; i++) 
    { 
    bitVal = (short) ((WordVal >> i) & 0x1); 
    sL = String.Format("Bit #{0:d} = {1:d}", i, bitVal); 
    Console.WriteLine(sL); 
    } 
2
x == (x | Math.Pow(2, y)); 

int x = 5; 

x == (x | Math.Pow(2, 0) //Bit 0 is ON; 
x == (x | Math.Pow(2, 1) //Bit 1 is OFF; 
x == (x | Math.Pow(2, 2) //Bit 2 is ON; 
+1

एसओ पर आमतौर पर आपके समाधान की व्याख्या करने के लिए यह एक अच्छा अभ्यास है, और क्यों। – ForceMagic

+0

ओएमजी, चलिए इस सवाल को अलग करते हैं कि क्या संकलक उन सभी गणित को सटीक कर देगा। आपके लिए, लेकिन क्यों नहीं ((x और Math.Pow)! = 0) क्यों? यह स्पष्ट है और कुछ नैनोसेकंड भी बचा सकता है। – Konstantin

10

पर Mario Fernandez's answer आधार पर, मैंने सोचा क्यों डेटाप्रकार तक ही सीमित नहीं एक आसान विस्तार पद्धति के रूप में मेरी पिटारे में यह नहीं है, इसलिए मुझे आशा है कि यह इसे यहाँ साझा करने के लिए ठीक है:

/// <summary> 
/// Returns whether the bit at the specified position is set. 
/// </summary> 
/// <typeparam name="T">Any integer type.</typeparam> 
/// <param name="t">The value to check.</param> 
/// <param name="pos"> 
/// The position of the bit to check, 0 refers to the least significant bit. 
/// </param> 
/// <returns>true if the specified bit is on, otherwise false.</returns> 
public static bool IsBitSet<T>(this T t, int pos) where T : struct, IConvertible 
{ 
var value = t.ToInt64(CultureInfo.CurrentCulture); 
return (value & (1 << pos)) != 0; 
} 
0

मारियो एफ कोड के बराबर , लेकिन मुखौटा के बजाए बाइट को स्थानांतरित करना:

bool IsBitSet(byte b, int pos) 
{ 
    return ((b >> pos) & 1) != 0; 
} 
संबंधित मुद्दे