अनुरोध के अनुसार, मैंने फोरफिंगर के उत्तर पर एक पूर्ण उत्तर के लिए मेरी टिप्पणी का विस्तार करने का निर्णय लिया। हालांकि उनका जवाब सही है, यह अनिवार्य रूप से जटिल है। इसके अलावा सभी मौजूदा उत्तरों मूल्यों का प्रतिनिधित्व करने के लिए int
एस पर हस्ताक्षर किए गए हैं। यह खतरनाक है, क्योंकि ऋणात्मक मूल्यों का दायां स्थानांतरित करना कार्यान्वयन-परिभाषित है (यानी पोर्टेबल नहीं) और बाएं-स्थानांतरण से अपरिभाषित व्यवहार हो सकता है (this question देखें)।
वांछित बिट को कम से कम महत्वपूर्ण स्थिति में दाएं स्थानांतरित करके, मास्किंग 1
के साथ किया जा सकता है। प्रत्येक बिट के लिए एक नया मास्क मान गणना करने की आवश्यकता नहीं है।
(n >> k) & 1
एक पूरा कार्यक्रम है, कंप्यूटिंग के रूप में (और बाद में मुद्रण) एकल बिट मूल्यों की एक सरणी:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
unsigned
input = 0b0111u,
n_bits = 4u,
*bits = (unsigned*)malloc(sizeof(unsigned) * n_bits),
bit = 0;
for(bit = 0; bit < n_bits; ++bit)
bits[bit] = (input >> bit) & 1;
for(bit = n_bits; bit--;)
printf("%u", bits[bit]);
printf("\n");
free(bits);
}
यह मानते हुए कि आप इस मामले में के रूप में सभी बिट्स गणना करना चाहते हैं, न कि किसी विशिष्ट एक , पाश आगे
for(bit = 0; bit < n_bits; ++bit, input >>= 1)
bits[bit] = input & 1;
इस जगह में input
को संशोधित करता है और इस तरह एक निरंतर चौड़ाई, एकल बिट पारी है, जो कुछ एक के बारे में अधिक कुशल हो सकता है के उपयोग की अनुमति के लिए बदला जा सकता है rchitectures।
'(एन >> ट) और 1' समान रूप से वैध है और कंप्यूटिंग वजह से अन्य तरह के बजाय मास्किंग से पहले स्थानांतरण करने के लिए मुखौटा के रूप में मुखौटा स्थिर है की आवश्यकता नहीं है चारों ओर। – Joe
@ जो आप इसे समझा सकते हैं, शायद एक जवाब में, कृपया? –
@Yar ने मेरी टिप्पणी को थोड़ा बढ़ाया और – Joe