बाइनरी अंकों का एक सरणी के लिए दशमलव अंक की सरणी में कनवर्ट करें

वोट
2

यह शायद एक काफी विदेशी सवाल है।

मेरे समस्या इस प्रकार है:

टीआई 83+ ग्राफिक कैलकुलेटर आप एक कंप्यूटर या उसके अंतर्निहित TI-बुनियादी प्रोग्रामिंग भाषा के लिए या तो विधानसभा और एक लिंक केबल का उपयोग उस पर कार्यक्रम करने की अनुमति देता।

मैं क्या मिल गया है के अनुसार, यह केवल 16-बिट पूर्णांकों और कुछ नकल करते तैरता का समर्थन करता है।

मैं, एक सा बड़ी संख्या में हालांकि (64 बिट के आसपास) के साथ काम करने के लिए इतना है कि मैं एकल अंक के साथ एक सरणी का उपयोग करना चाहते हैं:

{1, 2, 3, 4, 5}

दशमलव 12345 होगा।

बाइनरी में, कि 110000 00111001, या एक बाइनरी अंक सरणी के रूप में बताया गया है:

{1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1}

जो होगा कैसे कैलकुलेटर यह प्रदर्शित करता है।

मैं कैसे दशमलव अंक की एक सरणी में दशमलव अंक के इस सरणी (जो कैलकुलेटर एक देशी प्रकार के रूप में यह प्रदर्शित करने के लिए बहुत बड़ी है) में परिवर्तित करने के बारे में जाना होगा?

क्षमता एक मुद्दा नहीं है। यह होमवर्क नहीं है।

यह मैं इस तरह के सरणियों और इस तरह के लिए जोड़ को लागू करने के लिए स्वतंत्र छोड़ जाएगा।

धन्यवाद!

01/11/2009 को 13:10
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
0

यहाँ मुख्य मुद्दा यह है कि आप ठिकानों जो एक-दूसरे के गुणकों नहीं हैं, और इस तरह वहाँ इनपुट अंक और आउटपुट अंक के बीच एक सीधा अलग मानचित्रण नहीं है के बीच जा रहे हैं है। , आप और इतने पर इससे पहले कि आप अगले अंकों से परामर्श करने की आवश्यकता कर सकते हैं, के रूप में उत्पादन के उत्पादन के रूप में कई कम से कम महत्वपूर्ण अंक आप शायद अपने कम से कम महत्वपूर्ण अंकों के साथ शुरू करने के लिए जा रहे हैं। इस तरह आप केवल अपने इनपुट अंकों की अधिक से अधिक 2 की आवश्यकता है समय में किसी भी बिंदु पर जांच की जा रही।

आप इसे उलट रूप में अपना नंबर स्टोर करने के लिए प्रसंस्करण आदेश (जैसे कि कम से कम महत्वपूर्ण अंक सरणी में पहले आओ) के मामले में फायदेमंद हो सकता है।

01/11/2009 को 13:19
का स्रोत उपयोगकर्ता

वोट
1

इसके बारे में सोचा और मुझे लगता है कि मैं निम्नलिखित 'एल्गोरिथ्म' के साथ यह करना होगा

  • (उदाहरण के मामले में 5) पिछले अंक की जाँच
  • अगर यह द्विआधारी सरणी में अजीब, स्टोर (उलटे क्रम से) एक 1 है

  • अब निम्न विधि के माध्यम से 2 से संख्या विभाजित:

  • पहले अंक के साथ शुरू और 'ले' चर साफ़ करें।
  • यह 2 से विभाजित और 'ले' चर जोड़ें। शेष 1 है (इस जाँच से पहले आप एक और और 1 के साथ विभाजित करते हैं) तो कैरी में 5 डाल
  • दोहराने तक सभी अंक किया गया है

दोनों चरणों फिर से दोहरा तक पूरी संख्या 0 के लिए कम है।

अपने द्विआधारी सरणी में नंबर द्विआधारी प्रतिनिधित्व है

अपने उदाहरण: 1,2,3,4,5

  • 5 अजीब है तो हम द्विआधारी सरणी में 1 की दुकान: 1
  • हम कलन विधि का उपयोग 2 से सरणी विभाजित:
  • 0,2,3,4,5 => 0,1 + 5,3,4,5 => 0,6,1,4,5 => 0,6,1,2 + 5,5 => 0, 6,1,7,2

और दोहराओ:

0,6,1,7,2 पिछले अंक भी है तो हम एक 0 की दुकान: 0,1 (नोटिस हम दाईं से बाईं ओर बाइनरी स्ट्रिंग भरने)

आदि

आप एक द्विआधारी के साथ खत्म

संपादित करें: बस ऊपर स्पष्ट करने के लिए: सभी मैं कर रहा हूँ उम्र पुराने एल्गोरिथ्म है:

 int value=12345;
 while(value>0)
 {
      binaryArray.push(value&1);
      value>>=1;     //divide by 2
 }

अपने उदाहरण को छोड़कर हम किसी पूर्णांक लेकिन एक सरणी जो एक (10 आधार) का प्रतिनिधित्व करता है की जरूरत नहीं है पूर्णांक; ^)

01/11/2009 को 14:02
का स्रोत उपयोगकर्ता

वोट
0

रास्ते में दशमलव प्रतिनिधित्व में प्रत्येक अंक कन्वर्ट करने के लिए होगा यह द्विआधारी प्रतिनिधित्व है और फिर सभी अंकों की बाइनरी अभ्यावेदन जोड़ने के लिए:

5 = 101
40 = 101000
300 = 100101100
2000 = 11111010000
10000 = 10011100010000

             101
          101000
       100101100
     11111010000
+ 10011100010000
----------------
  11000000111001

सी # में अवधारणा का सबूत:

बाइनरी अंकों की एक सरणी में कनवर्ट करने, सरणियों जोड़ने और दस से एक सरणी गुणा करने के लिए तरीके:

private static byte[] GetBinary(int value) {
  int bit = 1, len = 1;
  while (bit * 2 < value) {
    bit <<= 1;
    len++;
  }
  byte[] result = new byte[len];
  for (int i = 0; value > 0;i++ ) {
    if (value >= bit) {
      value -= bit;
      result[i] = 1;
    }
    bit >>= 1;
  }
  return result;
}

private static byte[] Add(byte[] a, byte[] b) {
  byte[] result = new byte[Math.Max(a.Length, b.Length) + 1];
  int carry = 0;
  for (int i = 1; i <= result.Length; i++) {
    if (i <= a.Length) carry += a[a.Length - i];
    if (i <= b.Length) carry += b[b.Length - i];
    result[result.Length - i] = (byte)(carry & 1);
    carry >>= 1;
  }
  if (result[0] == 0) {
    byte[] shorter = new byte[result.Length - 1];
    Array.Copy(result, 1, shorter, 0, shorter.Length);
    result = shorter;
  }
  return result;
}

private static byte[] Mul2(byte[] a, int exp) {
  byte[] result = new byte[a.Length + exp];
  Array.Copy(a, result, a.Length);
  return result;
}

private static byte[] Mul10(byte[] a, int exp) {
  for (int i = 0; i < exp; i++) {
    a = Add(Mul2(a, 3), Mul2(a, 1));
  }
  return a;
}

एक सरणी परिवर्तित:

byte[] digits = { 1, 2, 3, 4, 5 };

byte[][] bin = new byte[digits.Length][];
int exp = 0;
for (int i = digits.Length - 1; i >= 0; i--) {
  bin[i] = Mul10(GetBinary(digits[i]), exp);
  exp++;
}
byte[] result = null;
foreach (byte[] digit in bin) {
  result = result == null ? digit: Add(result, digit);
}

// output array
Console.WriteLine(
  result.Aggregate(
    new StringBuilder(),
    (s, n) => s.Append(s.Length == 0 ? "" : ",").Append(n)
  ).ToString()
);

आउटपुट:

1,1,0,0,0,0,0,0,1,1,1,0,0,1

संपादित करें:
दसियों द्वारा एक सरणी गुणा करने के लिए जोड़ा गया तरीकों। यह एक द्विआधारी सरणी के लिए परिवर्तित करने से पहले अंकों गुणा करने का intead, यह सरणी के लिए किया जा सकता है।

01/11/2009 को 14:23
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more