निम्नलिखित अवधारणा पर आधारित है कि यदि आप AND
स्वयं के एक स्थानांतरित संस्करण के साथ थोड़ा अनुक्रम है, तो आप लगातार 1 की पंक्ति से पिछली 1 को हटा रहे हैं।
11101111 (x)
& 11011110 (x << 1)
----------
11001110 (x & (x << 1))
^^
| |
trailing 1 removed
दोहरा इस N
बार 0x00
करने के लिए N
लगातार 1 के साथ किसी भी क्रम कम हो जाएगा।
int count_consecutive_ones(int in) {
int count = 0;
while (in) {
in = (in & (in << 1));
count++;
}
return count;
}
की लगातार 0 के संख्या की गणना के लिए, बस को उलटने के लिए और एक ही दिनचर्या:
तो, लगातार 1 की यह गिन सकते हैं। अवधारणा के
int count_consecutive_zeros(int in) {
return count_consecutive_ones(~in);
}
सबूत: http://ideone.com/Z1l0D
int main(void) {
printf("%d has %d consecutive 1's\n", 0, count_consecutive_ones(0));
printf("%d has %d consecutive 0's\n", 0, count_consecutive_zeros(0));
/* 00000000 11110000 00000000 00000000 -> If it is 0 then length will be 20 */
printf("%x has %d consecutive 0's\n", 0x00F00000, count_consecutive_zeros(0x00F00000));
/* 11111111 11110000 11110111 11111111 -> If it is 1 then length will be 12 */
printf("%x has %d consecutive 1's\n", 0xFFF0F7FF, count_consecutive_ones(0xFFF0F7FF));
}
आउटपुट:
0 has 0 consecutive 1's
0 has 32 consecutive 0's
f00000 has 20 consecutive 0's
fff0f7ff has 12 consecutive 1's
स्रोत
2012-09-27 08:56:13
@bithacker, आप मतलब यह नहीं है कि "अगर 0 है, तो लंबाई 20 होगा? इसके अलावा, क्या यह सूची के अंत में सबसे लंबी स्ट्रिंग है? यह काफी संदिग्ध है। 10101111111010101 के बारे में क्या? –
@Aaron mcdaid आप सही हैं। यदि 0 लंबाई 20 होगी। आपके दूसरे प्रश्न का उत्तर 1 है। लगातार स्ट्रिंग कहीं भी हो सकती है। – bithacker
@ बिथकर: मैंने अभी महसूस किया है कि मेरा अपना उदाहरण थोड़ा संदिग्ध था। मेरी वर्तमान समझ यह है कि 0101000111101010 या तो शून्य या एक के लिए देख रहे हैं या नहीं, इस पर निर्भर करता है कि तीन या चार होंगे। –