2008-09-22 14 views
18

1 sn ve 0 sn'lik bir gelen stdinini stdin'den ilgili ikili değerlere dönüştürmeye çalışıyorum ("11110111" gibi bir dize 0xF7'ye dönüştürülecektir). Bu oldukça önemsiz gibi gözüküyor ama ben tekerleği yeniden icat etmek istemiyorum, bu yüzden C/C++ standart lib'lerinde böyle bir işlemi gerçekleştirebilecek bir şey olup olmadığını merak ediyorum.1s ve 0s dizesini ikili değere dönüştürme

+0

Ödev yok. Bir dizi hata ayıklama aracına daha kolay okumak için bir dönüştürücü yerleştirmeye çalışıyorum ama tüm girdimiz dize biçiminde geliyor. – grosauro

cevap

34
#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    char * ptr; 
    long parsed = strtol("11110111", & ptr, 2); 
    printf("%lX\n", parsed); 
    return EXIT_SUCCESS; 
} 

kullanabilirsiniz.

+0

Bu doğru görünüyor. Tek endişem şu anda bunu düşünen çok geniş dizelerdi, muhtemelen bazı özel kodlara ihtiyaç duyacaktı. – grosauro

+0

Strtol yanında "uzun uzun" tamsayılar için de gezinti (iki L) vardır. – jkramer

+0

Ah, şimdi senin noktanı görüyorum. Sonuç uzunluğu, uzun veya uzun uzun tamsayıya sığdığı sürece dize uzunluğu sorun olmamalıdır. – jkramer

9

Bir long long sürümü, strtoll olarak orada daha büyük numaraları için strtol

char string[] = "1101110100110100100000"; 
char * end; 
long int value = strtol (string,&end,2); 
14

std :: bitset'i kullanabilirsiniz (eğer bitlerin uzunluğu derleme zamanında biliniyorsa)
Bazı programlarda parçalara ayırıp birleştirebilirsiniz.

#include <bitset> 
#include <iostream> 

int main() 
{ 
    std::bitset<5> x(std::string("01011")); 

    std::cout << x << ":" << x.to_ulong() << std::endl; 
} 
6

Dinamik bitset Boost kullanabilirsiniz:

boost::dynamic_bitset<> x(std::string("01011")); 
std::cout << x << ":" << x.to_ulong() << std::endl; 
1

Bunun için birkaç fonksiyonları yazmış ve LGPL altında lisanslı ettik. here bulunabilir.

+0

Kaynak kodunuza baktım, gerçekten güzel iş! Ben de bit işletim fonksiyonlarını kopyaladım ve mantıksal düşünme için kağıda yazdım: D Bunları kullanacağım. – TuukkaX