int

2010-05-23 19 views
8

में उपयोग की जाने वाली बिट्स की लंबाई प्राप्त करें यदि आपके पास बाइनरी संख्या 10110 है तो मैं इसे 11111 लौटने के लिए कैसे प्राप्त कर सकता हूं? जैसे एक नया द्विआधारी संख्या है कि पहले 1 के बाद 1 करने के लिए सभी बिट्स सेट, कुछ वैसे ही नीचे सूचीबद्ध उदाहरण हैं:int

101 लौटना चाहिए 111 (3 बिट लंबाई) 011 11 (2 बिट लंबाई) लौटना चाहिए 11100 चाहिए वापसी 11111 (5 बिट लंबाई) 101010101 111111111 (9 बिट लंबाई)

जावा में यह सबसे आसान तरीका कैसे प्राप्त किया जा सकता है? मैं कुछ तरीकों से आ सकता था लेकिन वे बहुत "सुंदर" नहीं हैं।

+3

सब कुछ यहीं है: http://graphics.stanford.edu/~seander/bithacks.html –

उत्तर

6

आप इस कोड का उपयोग कर सकते हैं:

int setBits (int value) 
{ 
    value |= (value >> 1); 
    value |= (value >> 2); 
    value |= (value >> 4); 
    value |= (value >> 8); 
    value |= (value >> 16); 
    return value; 
} 

विचार है कि वाम-पंथी 1 पर सभी पदों के लिए कॉपी हो जाएगा सही।

संपादित करें: नकारात्मक value के साथ भी ठीक काम करता है। यदि आप को long के साथ प्रतिस्थापित करते हैं, तो एक अतिरिक्त |= कथन जोड़ें: value |= (value >> 32)। आम तौर पर, अंतिम शिफ्ट 2 की शक्ति होनी चाहिए जो बिट्स में कम से कम value आकार का आधा होना चाहिए।

+2

क्या है कि एल्गोरिथ्म के साथ विशेष रूप से अच्छा है कि यह पूर्व के संचालन पुनः उपयोग कर लेता है। नैतिक रूप से मैं सिर्फ 32 बदलाव किया होगा। –

+1

आप 'पूर्णांक # highestOneBit() के लिए कार्यान्वयन को देखें, तो' JDK में, आप एक ही एल्गोरिथ्म देखेंगे, हालांकि अंतिम चरण बनाया गया है, केवल एक एक बिट देने, नाश hleinone के जवाब में कब्जा की जरूरत पड़ेगी। – seh

6

परीक्षण किया है नहीं, लेकिन कुछ इस तरह ठीक होना चाहिए:

long setBits(long number) { 
    long n = 1; 
    while (n <= number) n <<= 1; 
    return n - 1; 
} 
+0

+1 बॉक्स के बाहर सोच :-) –

+1

इस के लिए काम नहीं करेगा और यदि ' संख्या' नकारात्मक है। यदि 'संख्या' आमतौर पर छोटा होता है तो यह तेज़ होगा, लेकिन धीमी गति से अगर' संख्या' इसकी सीमा पर समान रूप से वितरित की जाती है तो धीमा हो जाएगा। – doublep

+0

नकारात्मक के बारे में सच है, मैंने इसके बारे में नहीं सोचा था। और यदि मैं दूसरे छोर से शुरू हुआ तो औसत पर यह तेज़ होगा। लेकिन 63 पुनरावृत्तियों (अधिकतम) वास्तव में धीमी नहीं हैं; और जवाब मेरे सिर के ऊपर से था। जाहिर है, hleinone के समाधान पानी से बाहर यह चल रही है ... :) – Amadan

0

सबसे कारगर नहीं है, लेकिन सबसे सरल,

int i = (1 << (int)(Math.log(n)/Math.log(2)+1)) - 1; 

यह लंबे समय के लिए पूर्णांक के पहले 31 बिट और पहले 63 बिट के लिए काम करेंगे।

10

मेरे कोशिश: Integer.highestOneBit(b) * 2 - 1

+0

पूर्णता के लिए: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html#highestOneBit(int) – Eric

+0

हममम .. जैसे मैं लिंक पोस्ट नहीं कर सकते लगता है। तो ब्रैकेट पसंद नहीं है। – Eric

+3

वाह, यह नहीं पता था कि जावा के पास यह कार्य था ... यह निश्चित रूप से यहां सबसे अधिक अजीब है। – Amadan

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