c# - हरण - सबसे छोटा पूर्णांक
एक द्विआधारी प्रतिनिधित्व का रूपांतरण, बिगइंटेगर में पूर्णांक की सूची में(थोड़ा अंत) (2)
VB.Net में थोड़े समय तक जरूरी बिट स्थानांतरण दृष्टिकोण:
Function ToBigInteger(bits As List(Of Byte)) As BigInteger
Dim byteCount = (bits.Count + 7) >> 3
Dim bytes(byteCount) As Byte
For i = 0 To bits.Count - 1
If bits(i) <> 0 Then
bytes(i >> 3) = bytes(i >> 3) Or CByte(1 << (i And 7))
End If
Next
Return New BigInteger(bytes)
End Function
मेरे पास पूर्णांक की एक सूची है, एल कहते हैं, जिसमें एक संख्या का द्विआधारी प्रतिनिधित्व होता है सूची एल में प्रत्येक पूर्णांक 0 या 1 हो सकता है। "कम से कम महत्वपूर्ण बिट" बाईं तरफ है (दाईं ओर नहीं)
उदाहरण: 1000001111 (दशमलव) नंबर 961 या 551 के लिए 0111010001 के लिए।
मैं सूची को बिगिनटेगर में परिवर्तित करना चाहता हूं
मैंने अभी तक निम्नलिखित प्रयास किए हैं:
Dim bytes(L.Count - 1) As Byte
For i As Integer = 0 to L.Count - 1
bytes(i) = CByte(L(i))
Next
Dim Value As New BigInteger(bytes)
Return Value
लेकिन परिणाम पूरी तरह से गलत है। क्या कोई यह रूपांतरण करने में सहायता कर सकता है? सी # के vb.net उदाहरण समान रूप से सही हैं I
मैंने यहां एक प्रश्न से निम्नलिखित की तरह कुछ भी देखा है:
Buffer.BlockCopy(intArray, 0, byteArray, 0, byteArray.Length);
लेकिन अभी भी Biginteger रूपांतरण के साथ कोई सफलता नहीं है।
यह काम करना चाहिए, BitArray
का इस्तेमाल करके आपको मूल्य प्राप्त करने में मदद मिलेगी, और जॉन स्कीट से यह स्निपेट एक byte[]
को परिवर्तित करने के लिए byte[]
int[] ints = new[] { 1,0,0,0,0,0,1,1,1,1 };
// 1,0,0,... becomes true,false,false,... with this Select
BitArray bits = new BitArray(ints.Select(x => x > 0).ToArray());
byte[] bytes = new byte[(bits.Length + 7) / 8];
bits.CopyTo(bytes, 0);
BigInteger bigInt = new BigInteger(bytes); // 961
यदि प्रदर्शन महत्वपूर्ण है, तो आप शायद थोड़ा बदलाव का उपयोग करके अपने byte[]
का निर्माण करके इसे सुधार सकते हैं। लेकिन यह ठीक से (आईएमओ) संक्षिप्त, पठनीय है, और (मुझे उम्मीद थी) फास्ट कोड जैसा है-है
558 ( 0,1,1,1,0,1,0,0,0,1
) काम करता है, भी।