2016-01-05 8 views
5

पर विचार करें निम्नलिखित सहायक structs:मानक के अनुसार, एक पूर्णांक में मूल्य प्रतिनिधित्व बिट्स की संख्या?

template <class T> 
struct bit_count_1: 
std::integral_constant< 
    std::size_t, 
    std::numeric_limits<typename std::make_unsigned<T>::type>::digits 
> {}; 

template <class T> 
struct bit_count_2: 
std::integral_constant< 
    std::size_t, 
    std::numeric_limits<T>::digits + std::is_signed<T>::value 
> {}; 

template <class T> 
constexpr std::size_t compute_bit_count() { 
    using type = typename std::make_unsigned<T>::type; 
    constexpr type zero = 0; 
    constexpr type one = 1; 
    constexpr type max = ~zero; 
    type current = max; 
    std::size_t i = 0; 
    while (current) { 
     current >>= one; 
     ++i; 
    } 
    return i; 
} 

template <class T> 
struct bit_count_3: 
std::integral_constant< 
    std::size_t, 
    compute_bit_count<T>() 
> {}; 

हर अभिन्न प्रकार के लिए std::is_integral<T>::value है T ऐसी है कि true छोड़कर bool मानक से, मैं गारंटी है, कि:

  • bit_count_1, bit_count_2 और bit_count_3 एक ही मान N
  • T x = 1; x <<= (N - 1) अच्छी तरह से परिभाषित
  • 01 है
  • T x = ~static_cast<T>(0); x >>= (N - 1) अच्छी तरह से

मैं वर्तमान में एक सी ++ प्रस्ताव पर काम कर रहा हूँ परिभाषित किया गया है, तो मैं यकीन नहीं है कि इस मानक के अनुसार सही है, या नहीं, और पल के लिए यह मेरे लिए एक छोटे से स्पष्ट नहीं है की जरूरत है।

+0

उचित दर्शकों को आकर्षित करने में सहायता के लिए आप [टैग: भाषा-वकील] के लिए इस प्रश्न पर टैग में से एक को स्वैप करना चाहेंगे। – Angew

+1

... और सादे "सी ++" टैग के लिए एक और, जिसे सी ++ 11 और सी ++ 14 से अधिक का पालन किया जाता है। मैं या तो [टैग: सी ++ 11] या [टैग: मानकों] छोड़ दूंगा, लेकिन मैं इसे आपके पास छोड़ दूंगा। –

उत्तर

2

हां, ज़ाहिर है, आपके पास है!

[basic.types] 3.9 \ 4

मूल्य एक वस्तु का प्रतिनिधित्व बिट्स की सेट कि पकड़ प्रकार टी का मूल्य

है [basic.fundamental] 3.9.1 \ 3

एक पर हस्ताक्षर किए पूर्णांक प्रकार के गैर नकारात्मक मानों की श्रेणी इसी अहस्ताक्षरित पूर्णांक प्रकार का एक subrange है, और प्रत्येक इसी पर हस्ताक्षर किए/अहस्ताक्षरित प्रकार के मूल्य प्रतिनिधित्व ही होगा।

[basic.fundamental] 3.9.1 \ 7

अभिन्न प्रकार का निरूपण एक शुद्ध द्विआधारी संख्यान सिस्टम के उपयोग के द्वारा मान निर्धारित करेगा।

50) बाइनरी अंकों 0 और 1, जिसमें मूल्यों लगातार बिट्स का प्रतिनिधित्व करती additive हैं का उपयोग करता है पूर्णांकों के लिए एक स्थितीय प्रतिनिधित्व, 1 के साथ शुरू, और लगातार अभिन्न शक्ति से गुणा कर रहे हैं 2, शायद अधिकतम स्थिति के साथ थोड़ा सा छोड़कर। ( के लिए अमेरिकी राष्ट्रीय शब्दकोश से अनुकूलित सूचना प्रसंस्करण सिस्टम।)

लेकिन यह क्या गैर हस्ताक्षर बिट्स हैं पर निर्भर करता है:

[numeric.limits.members] 18.3.2.4 \ 9

पूर्णांक प्रकार के लिए, की संख्या प्रतिनिधित्व में गैर-हस्ताक्षर बिट

अगर वे निहित, कि संकेत बिट केवल में इतना sign-and-magnitude representation बुलाया होना चाहिए, तो आप इन भाव true के रूप में मूल्यांकन किया जाएगा:

  • bit_count_2<T>{} > bit_count_1<T>{}, और
  • bit_count_2<T>{} > bit_count_3<T>{},

हस्ताक्षरित पूर्णांक प्रकार टी के लिए दो या किसी के सह में प्रतिनिधित्व किया गया mplement। तो, मैं static_assert वैसे भी रखूंगा, आपको पता है ...

संबंधित मुद्दे