मुझे char
सरणी के रूप में प्रदर्शित बिट्ससेट्स के बीच हैमिंग दूरी की गणना करने की आवश्यकता है। यह एक कोर ऑपरेशन है, इसलिए इसे यथासंभव तेज़ होना चाहिए।बिटवाई ऑपरेशंस। क्या यह कोड सुरक्षित और पोर्टेबल है?
const int N = 32; // 32 always
// returns the number of bits that are ones in a char
int countOnes_uchar8(unsigned char v);
// pa and pb point to arrays of N items
int hamming(const unsigned char *pa, const unsigned char *pb)
{
int ret = 0;
for(int i = 0; i < N; ++i, ++pa, ++pb)
{
ret += countOnes_uchar8(*pa^*pb);
}
return ret;
}
रूपरेखा के बाद, मैंने देखा है कि int
रों पर काम तेजी से होता है, तो मैं ने लिखा है:: मैं कुछ इस तरह है
const int N = 32; // 32 always
// returns the number of bits that are ones in a int of 32 bits
int countOnes_int32(unsigned int v);
// pa and pb point to arrays of N items
int hamming(const unsigned char *pa, const unsigned char *pb)
{
const unsigned int *qa = reinterpret_cast<const unsigned int*>(pa);
const unsigned int *qb = reinterpret_cast<const unsigned int*>(pb);
int ret = 0;
for(int i = 0; i < N/sizeof(unsigned int); ++i, ++qa, ++qb)
{
ret += countOnes_int32(*qa^*qb);
}
return ret;
}
प्रश्न
1) कि है unsigned char *
से unsigned int *
सुरक्षित से?
2) मैं 32-बिट मशीन पर काम करता हूं, लेकिन मैं 64-बिट मशीन पर कोड को काम करना चाहता हूं। क्या sizeof(unsigned int)
दोनों मशीनों में 4 लौटाता है, या यह 64-बिट एक पर 8 है?
3) यदि sizeof(unsigned int)
64-बिट मशीन में 4 लौटा, तो मैं long long
के साथ 64-बिट प्रकार पर कैसे काम कर पाऊंगा?
आप अनवधि पूर्णांक का अधिकतम आकार, केवल न्यूनतम गारंटी नहीं कर सकते हैं। – OllieB
आप की गणना कैसे करते हैं? मैंने पाया कि बिट्स :: गिनती कुछ सिस्टम पर अपने कोड से तेज हो सकती है, क्योंकि यह विशेष सीपीयू निर्देश का लाभ लेती है। –
'std :: bitset' को पहले से ही अनुकूलित किया जाना चाहिए (और गिनने के लिए)। इसे फिर से क्यों करें? –