C ++ - Десяткове в двійкове перетворення


79

Я написав «просту» (на це у мене пішло 30 хвилин) програму, яка перетворює десяткове число в двійкове. Я впевнений, що існує набагато простіший спосіб, так що ви можете мені показати? Ось код:

#include <iostream>
#include <stdlib.h>

using namespace std;
int a1, a2, remainder;
int tab = 0;
int maxtab = 0;
int table[0];
int main()
{
    system("clear");
    cout << "Enter a decimal number: ";
    cin >> a1;
    a2 = a1; //we need our number for later on so we save it in another variable

    while (a1!=0) //dividing by two until we hit 0
    {
        remainder = a1%2; //getting a remainder - decimal number(1 or 0)
        a1 = a1/2; //dividing our number by two
        maxtab++; //+1 to max elements of the table
    }

    maxtab--; //-1 to max elements of the table (when dividing finishes it adds 1 additional elemnt that we don't want and it's equal to 0)
    a1 = a2; //we must do calculations one more time so we're gatting back our original number
    table[0] = table[maxtab]; //we set the number of elements in our table to maxtab (we don't get 10's of 0's)

    while (a1!=0) //same calculations 2nd time but adding every 1 or 0 (remainder) to separate element in table
    {
        remainder = a1%2; //getting a remainder
        a1 = a1/2; //dividing by 2
        table[tab] = remainder; //adding 0 or 1 to an element
        tab++; //tab (element count) increases by 1 so next remainder is saved in another element
    }

    tab--; //same as with maxtab--
    cout << "Your binary number: ";

    while (tab>=0) //until we get to the 0 (1st) element of the table
    {
        cout << table[tab] << " "; //write the value of an element (0 or 1)
        tab--; //decreasing by 1 so we show 0's and 1's FROM THE BACK (correct way)
    }

    cout << endl;
    return 0;
}

До речі, це складно, але я намагався з усіх сил.

редагувати - Ось рішення, яке я використав:

std::string toBinary(int n)
{
    std::string r;
    while(n!=0) {r=(n%2==0 ?"0":"1")+r; n/=2;}
    return r;
}

3
int value = (some value); for (int i = (sizeof(value)*8)-1; i <= 0; i--) { cout << (value & (1 << i)) ? '1' : '0'; } cout << endl;
mah

Оберніть все це у функцію типу std::string ToBinary(int decimal), тоді це буде просто в майбутньому :)
Крістіан Хакл

Там немає десяткового дробу. Ви повинні це зрозуміти, перш ніж грати з основами.
Слава

Це повинна бути струна, а не порожнеча
Вільгельм Еразм,

Ваше "рішення" не компілюється; ваша функція повертає рядок, але підпис функції говорить, що вона нічого не повертає.
Джонатан Леффлер,

Відповіді:


155

std::bitsetмає .to_string()метод, який повертає std::stringутримання текстового подання у двійковому вигляді, із заповненням нулем.

Виберіть ширину бітового набору, як потрібно для ваших даних, наприклад, std::bitset<32>щоб отримати 32-символьні рядки з 32-бітових цілих чисел.

#include <iostream>
#include <bitset>

int main()
{
    std::string binary = std::bitset<8>(128).to_string(); //to binary
    std::cout<<binary<<"\n";

    unsigned long decimal = std::bitset<8>(binary).to_ulong();
    std::cout<<decimal<<"\n";
    return 0;
}

РЕДАГУВАТИ: Будь ласка, не редагуйте мою відповідь на восьмеричну та шістнадцяткову. OP спеціально запитував десяткову до двійкової.


@brandon, але робить це для числа більше 256
sql_dummy

1
@sql_dummy так. Замість вказівки 8 біт, вкажіть більшу кількість. Спробуйте натомість 32.
Брендон

2
Для тих, хто шукає шістнадцяткових перетворень, використовуйте itoa:: cplusplus.com/reference/cstdlib/itoa
Брендон

Що робити, якщо розмір біт неможливо вказати під час компіляції?
Cuhrazatee

Потім @Cuhrazatee вкажіть найбільший біт, який ви можете. std::size_t
Брендон

49

Далі подана рекурсивна функція, яка приймає ціле додатне число та друкує двійкові цифри на консолі.

Алекс запропонував, для ефективності ви можете видалити printf()та зберегти результат у пам'яті ... залежно від методу зберігання результат може бути зворотним.

/**
 * Takes a unsigned integer, converts it into binary and prints it to the console.
 * @param n the number to convert and print
 */
void convertToBinary(unsigned int n)
{
    if (n / 2 != 0) {
        convertToBinary(n / 2);
    }
    printf("%d", n % 2);
}

Подяки UoA ENGGEN 131

* Примітка: Перевага використання непідписаного int полягає в тому, що він не може бути негативним.


6
Можливо, ви захочете зробити nпараметр an, unsigned intоскільки функція працює неправильно для від’ємних чисел.
Олексій

Окремий printfдзвінок для кожного біта досить жахливий. Це "високоефективне" - це сарказм, так?
Пітер Кордес,

@Peter Cordes Я б хотів, щоб це був сарказм, але будучи першим курсом в університеті, це часто не так. Хочете змінити це, використовуючи скажімо .. біт зміщення? Я оновлю опис із "високоефективного" на "легко кодується".
Pathfinder

@Pathfinder: так, оптимальним рішенням для ефективності є, мабуть, щось на зразок того, що я описав у коментарі до іншої відповіді . Оскільки довжина рядка є константою часу компіляції (ширина типу), ви можете просто зробити a char buf[CHAR_BIT*sizeof(unsigned)]. Зациклюйтеся на ньому, поки ви перебираєте біти цілого числа, використовуючи Shift + маска. '0' + 1призначений '1'для ASCII, UTF8 та будь-якого іншого здорового набору символів, тож ви можете зробити '0' + (n&1)цифру.
Пітер Кордес,

У будь-якому випадку, заповнення буфера і виклик printf один раз є величезною виграшю над викликом його 32 рази. Крім того, ви не завжди хочете друкувати його безпосередньо; іноді хочеться з цим зробити щось інше.
Пітер Кордес,


10

Досить пряме рішення для друку двійкових файлів:

#include <iostream>
using namespace std;
int main()
{
 int num,arr[64];
 cin>>num;
 int i=0,r;
 while(num!=0)
{
  r = num%2;
  arr[i++] = r;
  num /= 2;
}

for(int j=i-1;j>=0;j--){
 cout<<arr[j];
  }
}

це врятувало для мене багато головного болю.
Vahedi

5

Нерекурсивне рішення:

#include <iostream>
#include<string>


std::string toBinary(int n)
{
    std::string r;
    while(n!=0) {r=(n%2==0 ?"0":"1")+r; n/=2;}
    return r;
}
int main()
{
    std::string i= toBinary(10);
    std::cout<<i;
}

Рекурсивне рішення:

#include <iostream>
#include<string>

std::string r="";
std::string toBinary(int n)
{
    r=(n%2==0 ?"0":"1")+r;
    if (n / 2 != 0) {
        toBinary(n / 2);
    }
    return r;
}
int main()
{
    std::string i=toBinary(10);
    std::cout<<i;
}

1
Ви повинні використовувати бітовий зсув замість /=2, або використовувати unsignedподіл на два - це просто зсув. Крім того, ви можете використовувати, '0' + n%2щоб отримати ASCII / UTF-8 0 або 1. '1'- це наступний символ ASCII після '0', тому ви можете просто додати замість того, щоб використовувати ?:. Крім того, ви можете char buf[sizeof(n)]виконати цикл замість того, щоб додавати до рядка по одному символу за раз.
Пітер Кордес,

4

Ось два підходи. Один подібний до вашого підходу

#include <iostream>
#include <string>
#include <limits>
#include <algorithm>

int main()
{
    while ( true )
    {
        std::cout << "Enter a non-negative number (0-exit): ";

        unsigned long long x = 0;
        std::cin >> x;

        if ( !x ) break;

        const unsigned long long base = 2;

        std::string s;
        s.reserve( std::numeric_limits<unsigned long long>::digits ); 

        do { s.push_back( x % base + '0' ); } while ( x /= base );

        std::cout << std::string( s.rbegin(), s.rend() )  << std::endl;
    }
}

а інший використовує std :: bitset, як пропонували інші.

#include <iostream>
#include <string>
#include <bitset>
#include <limits>

int main()
{
    while ( true )
    {
        std::cout << "Enter a non-negative number (0-exit): ";

        unsigned long long x = 0;
        std::cin >> x;

        if ( !x ) break;

        std::string s = 
            std::bitset<std::numeric_limits<unsigned long long>::digits>( x ).to_string();

        std::string::size_type n = s.find( '1' ); 
        std::cout << s.substr( n )  << std::endl;
    }
}

4

intЗмінна не в десяткової системі числення, то в двійковій системі . Що ви шукаєте, це двійкове рядкове представлення числа, яке ви можете отримати, застосувавши маску, яка фільтрує окремі біти, а потім роздрукуючи їх:

for( int i = sizeof(value)*CHAR_BIT-1; i>=0; --i)
    cout << value & (1 << i) ? '1' : '0';

Це рішення, якщо ваше запитання алгоритмічне. Якщо ні, вам слід використовувати клас std :: bitset, щоб обробити це для вас:

bitset< sizeof(value)*CHAR_BIT > bits( value );
cout << bits.to_string();

3

Перетворення натурального числа у двійковий рядок:

string toBinary(int n) {
    if (n==0) return "0";
    else if (n==1) return "1";
    else if (n%2 == 0) return toBinary(n/2) + "0";
    else if (n%2 != 0) return toBinary(n/2) + "1";
}

2

Ось сучасний варіант, який можна використовувати для intsрізних розмірів.

#include <type_traits>
#include <bitset>

template<typename T>
std::enable_if_t<std::is_integral_v<T>,std::string>
encode_binary(T i){
    return std::bitset<sizeof(T) * 8>(i).to_string();
}

0

Ви хочете зробити щось на зразок:

cout << "Enter a decimal number: ";
cin >> a1;
cout << setbase(2);
cout << a1

4
Допустимі значення setbaseє 16, 8і 10. Будь-яке інше значення скидає базове поле до нуля (десятковий вивід та вихідний префікс). Детальніше див. Це посилання: std :: setbase - cpprefernce.com
CPlusPlus OOA та D

0

НЕ ВИКОРИСТОВАНИХ МАСИВ *, зроблених Oya:

Я все ще новачок, тому цей код використовуватиме лише цикли та змінні xD ...

Сподіваюся, вам сподобається. Це, мабуть, можна зробити простішим, ніж є ...

    #include <iostream>
    #include <cmath>
    #include <cstdlib>

    using namespace std;

    int main()
    {
        int i;
        int expoentes; //the sequence > pow(2,i) or 2^i
        int decimal; 
        int extra; //this will be used to add some 0s between the 1s
        int x = 1;

        cout << "\nThis program converts natural numbers into binary code\nPlease enter a Natural number:";
        cout << "\n\nWARNING: Only works until ~1.073 millions\n";
        cout << "     To exit, enter a negative number\n\n";

        while(decimal >= 0){
            cout << "\n----- // -----\n\n";
            cin >> decimal;
            cout << "\n";

            if(decimal == 0){
                cout << "0";
            }
            while(decimal >= 1){
                i = 0;
                expoentes = 1;
                while(decimal >= expoentes){
                    i++;
                    expoentes = pow(2,i);
                }
                x = 1;
                cout << "1";
                decimal -= pow(2,i-x);
                extra = pow(2,i-1-x);
                while(decimal < extra){
                    cout << "0";
                    x++;
                    extra = pow(2,i-1-x);
                }
            }
        }
        return 0;
    }

Що вам слід зробити, це прокрутити через a char buffer[32], встановивши buffer[i] = '0' + (tmp&1)для збереження '0'або '1'(ASCII / UTF-8 символ) відповідно до мінімального біта tmp. Потім tmp >>= 1вправо-зрушення. Використовувати плаваючу крапку powпросто божевільно, особливо для степенів двох.
Пітер Кордес,

0

тут простий перетворювач за допомогою std::stringконтейнера. це допускає від’ємне значення.

#include <iostream>
#include <string>
#include <limits>

int main()
{
    int x = -14;

    int n = std::numeric_limits<int>::digits - 1;

    std::string s;
    s.reserve(n + 1);

    do
        s.push_back(((x >> n) & 1) + '0');
    while(--n > -1);

    std::cout << s << '\n';
}

0

Це більш проста програма, ніж будь-коли

//Program to convert Decimal into Binary
#include<iostream>
using namespace std;
int main()
{
    long int dec;
    int rem,i,j,bin[100],count=-1;
    again:
    cout<<"ENTER THE DECIMAL NUMBER:- ";
    cin>>dec;//input of Decimal
    if(dec<0)
    {
        cout<<"PLEASE ENTER A POSITIVE DECIMAL";
        goto again;
    }
    else
        {
        cout<<"\nIT's BINARY FORM IS:- ";
        for(i=0;dec!=0;i++)//making array of binary, but reversed
        {
            rem=dec%2;
            bin[i]=rem;
            dec=dec/2;
            count++;
        }
        for(j=count;j>=0;j--)//reversed binary is printed in correct order
        {
            cout<<bin[j];
        }
    }
    return 0; 
}

0

Насправді це дуже простий спосіб. Ми використовуємо рекурсивну функцію, якій задано число (int) у параметрі. Це досить легко зрозуміти. Ви також можете додати інші умови / варіації. Ось код:

int binary(int num)
{
    int rem;
    if (num <= 1)
        {
            cout << num;
            return num;
        }
    rem = num % 2;
    binary(num / 2);
    cout << rem;
    return rem;
}

0
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<cmath>

using namespace std;

int main() {
    // Initialize Variables
    double x;
    int xOct;
    int xHex;

    //Initialize a variable that stores the order if the numbers in binary/sexagesimal base
    vector<int> rem;

    //Get Demical value
    cout << "Number (demical base): ";
    cin >> x;

    //Set the variables
    xOct = x;
    xHex = x;

    //Get the binary value
    for (int i = 0; x >= 1; i++) {
        rem.push_back(abs(remainder(x, 2)));
        x = floor(x / 2);
    }

    //Print binary value
    cout << "Binary: ";
    int n = rem.size();
    while (n > 0) {
        n--;
        cout << rem[n];
    } cout << endl;

    //Print octal base
    cout << oct << "Octal: " << xOct << endl;

    //Print hexademical base
    cout << hex << "Hexademical: " << xHex << endl;

    system("pause");
    return 0;
}


0
HOPE YOU LIKE THIS SIMPLE CODE OF CONVERSION FROM DECIMAL TO BINARY


  #include<iostream>
    using namespace std;
    int main()
    {
        int input,rem,res,count=0,i=0;
        cout<<"Input number: ";
        cin>>input;`enter code here`
        int num=input;
        while(input > 0)
        {
            input=input/2;  
            count++;
        }

        int arr[count];

        while(num > 0)
        {
            arr[i]=num%2;
            num=num/2;  
            i++;
        }
        for(int i=count-1 ; i>=0 ; i--)
        {
            cout<<" " << arr[i]<<" ";
        }



        return 0;
    }

0
std::string bin(uint_fast8_t i){return !i?"0":i==1?"1":bin(i/2)+(i%2?'1':'0');}

@ Rabbid76 Запитувач шукає "простіший спосіб" перетворити "десяткове число в двійкове", оскільки його початкова програма була настільки довгою, що він відчував ", що існує набагато простіший спосіб" вирішення проблеми. Він запитує: "так ви можете мені показати?" Пізніше він відредагував своє запитання: "Ось рішення, яке я в підсумку використав". Моя відповідь, яка є просто різновидом його рішення, пропонує простіший спосіб перетворення десяткового в двійковий. Зараз мені надзвичайно цікаво зрозуміти вашу інтерпретацію запитання, оскільки ваша рекомендація трохи недоречна, оскільки автор запиту неактивний майже 3 роки.
qlp

0
// function to convert decimal to binary
void decToBinary(int n)
{
    // array to store binary number
    int binaryNum[1000];

    // counter for binary array
    int i = 0;
    while (n > 0) {

        // storing remainder in binary array
        binaryNum[i] = n % 2;
        n = n / 2;
        i++;
    }

    // printing binary array in reverse order
    for (int j = i - 1; j >= 0; j--)
        cout << binaryNum[j];
}

посилання: - https://www.geeksforgeeks.org/program-decimal-binary-conversion/

або за допомогою функції: -

#include<bits/stdc++.h>
using namespace std;

int main()
{

    int n;cin>>n;
    cout<<bitset<8>(n).to_string()<<endl;


}

або за допомогою лівої зміни

#include<bits/stdc++.h>
using namespace std;
int main()
{
    // here n is the number of bit representation we want 
    int n;cin>>n;

    // num is a number whose binary representation we want
    int num;
    cin>>num;

    for(int i=n-1;i>=0;i--)
    {
        if( num & ( 1 << i ) ) cout<<1;
        else cout<<0;
    }


}

0

Для цього в C ++ ви можете використовувати функцію itoa (). Ця функція перетворює будь-яке десяткове ціле число у двійкове, десяткове, шістнадцяткове та вісімкове число.

#include<bits/stdc++.h>
using namespace std;
int main(){
 int a;    
 char res[1000];
 cin>>a;
 itoa(a,res,10);
 cout<<"Decimal- "<<res<<endl;
 itoa(a,res,2);
 cout<<"Binary- "<<res<<endl;
 itoa(a,res,16);
 cout<<"Hexadecimal- "<<res<<endl;
 itoa(a,res,8);
 cout<<"Octal- "<<res<<endl;return 0;
}

Однак він підтримується лише певними компіляторами.

Ви також можете побачити: itoa - Довідник C ++


0
#include <iostream>
#include <bitset>

#define bits(x)  (std::string( \
            std::bitset<8>(x).to_string<char,std::string::traits_type, std::string::allocator_type>() ).c_str() )


int main() {

   std::cout << bits( -86 >> 1 ) << ": " << (-86 >> 1) << std::endl;

   return 0;
}

0

Гаразд .. Можливо, я трохи новачок у C ++, але я вважаю, що наведені вище приклади не зовсім роблять роботу належним чином.

Ось мій погляд на цю ситуацію.

char* DecimalToBinary(unsigned __int64 value, int bit_precision)
{
    int length = (bit_precision + 7) >> 3 << 3;
    static char* binary = new char[1 + length];
    int begin = length - bit_precision;
    unsigned __int64 bit_value = 1;
    for (int n = length; --n >= begin; )
    {
        binary[n] = 48 | ((value & bit_value) == bit_value);
        bit_value <<= 1;
    }
    for (int n = begin; --n >= 0; )
        binary[n] = 48;

    binary[length] = 0;
    return binary;
}

@value = Значення, яке ми перевіряємо.

@bit_precision = Найвищий лівий біт для перевірки.

@Length = Максимальний розмір блоку байтів. Наприклад, 7 = 1 байт і 9 = 2 байти, але ми представляємо це у вигляді бітів, тому 1 байт = 8 бітів.

@binary = просто якесь тупе ім'я, яке я дав для виклику масиву символів, який ми встановлюємо. Ми встановлюємо цей параметр як статичний, щоб він не відтворювався з кожним викликом. Якщо просто отримати результат і відобразити його, це добре працює, але якщо, скажімо, ви хочете відобразити кілька результатів в інтерфейсі, всі вони відображатимуться як останній результат. Це можна виправити, видаливши статику, але не забудьте видалити [] результати, коли закінчите з цим.

@begin = Це найнижчий показник, який ми перевіряємо. Все, що перебуває за цим пунктом, ігнорується. Або як показано в 2-му циклі, встановленому на 0.

@first loop - Тут ми встановлюємо значення 48 і в основному додаємо 0 або 1 до 48 на основі значення bool (value & bit_value) == bit_value. Якщо це істина, char встановлюється на 49. Якщо це хибно, char встановлюється на 48. Тоді ми зміщуємо bit_value або в основному помножуємо його на 2.

@second loop - Тут ми встановлюємо всі проігноровані індекси на 48 або '0'.

ДЕЯКІ ПРИКЛАДИ ВИХОДІВ !!!

int main()
{
    int val = -1;
    std::cout << DecimalToBinary(val, 1) << '\n';
    std::cout << DecimalToBinary(val, 3) << '\n';
    std::cout << DecimalToBinary(val, 7) << '\n';
    std::cout << DecimalToBinary(val, 33) << '\n';
    std::cout << DecimalToBinary(val, 64) << '\n';
    std::cout << "\nPress any key to continue. . .";
    std::cin.ignore();
    return 0;
}

00000001 //Value = 2^1 - 1
00000111 //Value = 2^3 - 1.
01111111 //Value = 2^7 - 1.
0000000111111111111111111111111111111111 //Value = 2^33 - 1.
1111111111111111111111111111111111111111111111111111111111111111 //Value = 2^64 - 1.

ШВИДКІ ТЕСТИ

Відповідь оригінального запитання: "Метод: toBinary (int);"

Виконання: 10000, загальний час (мілі): 4701,15, середній час (наносекунди): 470114

Моя версія: "Метод: DecimalToBinary (int, int);"

// Використання 64-бітної точності.

Виконання: 10 000 000, загальний час (мілі): 3386, середній час (наносекунди): 338

// Використання 1 бітової точності.

Виконання: 10 000 000, загальний час (мілі): 634, середній час (наносекунди): 63


0
#include <iostream>

// x is our number to test
// pow is a power of 2 (e.g. 128, 64, 32, etc...)
int printandDecrementBit(int x, int pow)
{
    // Test whether our x is greater than some power of 2 and print the bit
    if (x >= pow)
    {
        std::cout << "1";
        // If x is greater than our power of 2, subtract the power of 2
        return x - pow;
    }
    else
    {
        std::cout << "0";
        return x;
    }
}

int main()
{
    std::cout << "Enter an integer between 0 and 255: ";
    int x;
    std::cin >> x;

    x = printandDecrementBit(x, 128);
    x = printandDecrementBit(x, 64);
    x = printandDecrementBit(x, 32);
    x = printandDecrementBit(x, 16);

    std::cout << " ";

    x = printandDecrementBit(x, 8);
    x = printandDecrementBit(x, 4);
    x = printandDecrementBit(x, 2);
    x = printandDecrementBit(x, 1);

    return 0;
}

це простий спосіб отримати двійкову форму int. кредит на learncpp.com. я впевнений, що це можна використовувати різними способами, щоб дійти до однієї точки.


0

При такому підході десяткове число буде перетворено у відповідне двійкове число у форматі рядка. Тип рядка повернення вибирається так як він може обробляти більше діапазон вхідних значень.

class Solution {
public:
  string ConvertToBinary(int num) 
  {
    vector<int> bin;
    string op;
    for (int i = 0; num > 0; i++)
    {
      bin.push_back(num % 2);
      num /= 2;
    }
    reverse(bin.begin(), bin.end());
    for (size_t i = 0; i < bin.size(); ++i)
    {
      op += to_string(bin[i]);
    }
    return op;
  }
};

0

Мій спосіб перетворення десяткового в двійковий на C ++. Але оскільки ми використовуємо мод, ця функція буде працювати і в шістнадцятковій чи вісімковій. Ви також можете вказати біти. Ця функція продовжує обчислювати найменший значущий біт і розміщує його в кінці рядка. Якщо ви не настільки подібні до цього методу, ніж можете переглянути : https://www.wikihow.com/Convert-from-Decimal-to-Binary

#include <bits/stdc++.h>
using namespace std;

string itob(int bits, int n) {
    int c;
    char s[bits+1]; // +1 to append NULL character.

    s[bits] = '\0'; // The NULL character in a character array flags the end of the string, not appending it may cause problems.

    c = bits - 1; // If the length of a string is n, than the index of the last character of the string will be n - 1. Cause the index is 0 based not 1 based. Try yourself.

    do {
        if(n%2) s[c] = '1';
        else s[c] = '0';
        n /= 2;
        c--;
    } while (n>0);

    while(c > -1) {
        s[c] = '0';
        c--;
}

    return s;
}

int main() {
    cout << itob(1, 0) << endl; // 0 in 1 bit binary.
    cout << itob(2, 1) << endl; // 1 in 2 bit binary.
    cout << itob(3, 2) << endl; // 2 in 3 bit binary.
    cout << itob(4, 4) << endl; // 4 in 4 bit binary.
    cout << itob(5, 15) << endl; // 15 in 5 bit binary.
    cout << itob(6, 30) << endl; // 30 in 6 bit binary.
    cout << itob(7, 61) << endl; // 61 in 7 bit binary.
    cout << itob(8, 127) << endl; // 127 in 8 bit binary.
    return 0;
}

Результат:

0
01
010
0100
01111
011110
0111101
01111111

0

Ваше рішення потребує модифікації. Кінцевий рядок слід змінити перед поверненням:

std::reverse(r.begin(), r.end());
return r;

0

використовуючи бітову маску та побітове та.

string int2bin(int n){
    string x;
    for(int i=0;i<32;i++){
        if(n&1) {x+='1';}
        else {x+='0';}
        n>>=1;
    }
    reverse(x.begin(),x.end());
    return x;
}

0

Нижче наведено простий код С, який перетворює двійковий код в десятковий і назад. Я написав це давно для проекту , в якому мета була вбудований процесор і засіб розробки були STDLIB , який був шлях надто великим для прошивки ПЗУ.

Це загальний код С, який не використовує жодної бібліотеки, не використовує поділ або оператор залишку (%) (що є повільним для деяких вбудованих процесорів), не використовує жодної плаваючої крапки, не використовує жодного пошуку в таблиці, а також наслідувати будь-яку арифметику BCD. Для чого він використовує це тип long long, більш конкретно unsigned long long(або uint64_t), тому, якщо ваш вбудований процесор (і компілятор C, який поєднується з ним) не може виконувати 64-розрядну цілочисельну арифметику, цей код не для вашої програми. В іншому випадку, я думаю, це код якості виробництва C (можливо, після зміни longна int32_tта unsigned long longна uint64_t). Я запустив це протягом ночі, щоб перевірити його на кожні 2³² підписаних цілих значень, і немає помилок у перетворенні в будь-якому напрямку.

У нас був компілятор / компонувальник C, який міг генерувати виконувані файли, і нам потрібно було робити те, що ми могли робити без будь-якого stdlib (що було свинею). Так що ні, printf()ні scanf(). Навіть sprintf()ні нор sscanf(). Але у нас все ще був користувальницький інтерфейс, і нам довелося перетворити числа base-10 у двійкові та назад. (Ми також створили свою власну malloc()утиліту, а також наші власні трансцендентні математичні функції).

Ось так я це зробив ( mainпрограма та виклики stdlib були там для тестування цієї речі на моєму mac, а не для вбудованого коду). Крім того, оскільки деякі старіші системи розробників не розпізнають " int64_t" і " uint64_t" та подібні типи, типи long longта unsigned long longвикористовуються і вважаються однаковими. І longпередбачається 32 біти. Я здогадуюсь я міг typedefце зробити.


-2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

void Decimal2Binary(long value,char *b,int len)
{
    if(value>0)
    {
        do
        {
            if(value==1)
            {
                *(b+len-1)='1';
                break;
            }
            else
            {
                *(b+len-1)=(value%2)+48;
                value=value/2;
                len--;
            }
        }while(1);
    }
}
long Binary2Decimal(char *b,int len)
{
    int i=0;
    int j=0;
    long value=0;
    for(i=(len-1);i>=0;i--)
    {
        if(*(b+i)==49)
        {
            value+=pow(2,j);
        }
        j++;
    }
    return value;
}
int main()
{
    char data[11];//最後一個BIT要拿來當字串結尾
    long value=1023;
    memset(data,'0',sizeof(data));
    data[10]='\0';//字串結尾
    Decimal2Binary(value,data,10);
    printf("%d->%s\n",value,data);
    value=Binary2Decimal(data,10);
    printf("%s->%d",data,value);
    return 0;
}

3
Ви повинні пояснити трохи більше, якщо хочете, щоб ваша відповідь принесла користь громаді. Плюс ви коментували якоюсь невідомою мовою. Будь ласка, відредагуйте.
J. Chomel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.