Aku menulis 'sederhana' (butuh 30 menit) program yang mengkonversi bilangan desimal ke biner. Saya YAKIN bahwa ada's banyak cara yang lebih sederhana sehingga anda dapat menunjukkan padaku? Berikut ini's kode:
#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;
}
Dengan cara itu's rumit tapi saya mencoba yang terbaik.
edit - Berikut ini adalah solusi akhirnya saya menggunakan:
std::string toBinary(int n)
{
std::string r;
while(n!=0) {r=(n%2==0 ?"0":"1")+r; n/=2;}
return r;
}
std::bitset
memiliki .to_string()
metode yang mengembalikan std::string
memegang teks representasi biner, dengan leading-zero padding.
Memilih lebar bitset yang diperlukan untuk data anda, misal std::bitset<32>
untuk mendapatkan 32-karakter string dari 32-bit integer.
#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;
}
EDIT: Mohon untuk tidak mengedit jawaban saya untuk Oktal dan Heksadesimal. OP secara khusus meminta Desimal Ke Biner.
Berikut adalah fungsi rekursif yang mengambil bilangan bulat positif dan cetakan nya digit biner ke konsol.
Alex menyarankan, untuk efisiensi, anda mungkin ingin menghapus printf()
dan menyimpan hasilnya dalam memori... tergantung pada cara penyimpanan hasil dapat dibatalkan.
/**
* 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);
}
Kredit untuk UoA ENGGEN 131
*Catatan: keuntungan menggunakan unsigned int adalah bahwa hal itu dapat't menjadi negatif.
Anda dapat menggunakan std::bitset untuk mengkonversi nomor ke format biner.
Menggunakan potongan kode berikut:
std::string binary = std::bitset<8>(n).to_string();
Saya menemukan ini di stackoverflow itu sendiri. Saya melampirkan link.
Non rekursif solusi:
#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;
}
Rekursif solusi:
#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;
}
Sebuah int
variabel tidak dalam desimal, it's dalam biner. Apa yang anda'kembali mencari sebuah string biner representasi dari jumlah tersebut, yang bisa anda dapatkan dengan menerapkan masker filter yang masing-masing bit, dan kemudian mencetak mereka:
for( int i = sizeof(value)*CHAR_BIT-1; i>=0; --i)
cout << value & (1 << i) ? '1' : '0';
Yang's solusi jika pertanyaan anda adalah algoritmik. Jika tidak, anda harus menggunakan std::bitset kelas untuk menangani hal ini untuk anda:
bitset< sizeof(value)*CHAR_BIT > bits( value );
cout << bits.to_string();
Berikut ini adalah dua pendekatan. Yang satu ini mirip dengan pendekatan anda
#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;
}
}
dan yang lain menggunakan std::bitset seperti orang-orang lain yang disarankan.
#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;
}
}
Berikut ini adalah modern varian yang dapat digunakan untuk int
ukuran yang berbeda.
#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();
}
// 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];
}
lihat :- https://www.geeksforgeeks.org/program-decimal-binary-conversion/
atau menggunakan fungsi :-
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;cin>>n;
cout<<bitset<8>(n).to_string()<<endl;
}
atau menggunakan shift kiri
#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;
}
}
Untuk ini , Di C++ anda dapat menggunakan itoa() fungsi .Fungsi ini mengubah bilangan bulat Desimal ke biner, desimal , heksadesimal dan oktal nomor.
#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;
}
Namun, itu hanya didukung oleh compiler tertentu.
Anda bisa lihat juga: itoa - [Referensi C++] (http://www.cplusplus.com/reference/cstdlib/itoa/)
Di bawah ini adalah sederhana kode C yang mengkonversi biner ke desimal dan kembali lagi. Saya menulis itu lama untuk sebuah proyek di mana target itu tertanam prosesor dan alat-alat pengembangan punya stdlib itu cara terlalu besar untuk firmware ROM.
Ini adalah generic kode C yang tidak menggunakan perpustakaan, juga tidak menggunakan pembagian atau sisa (%) operator (yang lambat pada beberapa prosesor tertanam), juga tidak menggunakan floating point, juga tidak menggunakan tabel lookup atau meniru setiap aritmatika BCD. Apa itu tidak membuat penggunaan adalah jenis lama
, lebih khusus unsigned long long
(atau uint64
), jadi jika anda tertanam prosesor (dan C compiler yang terjadi dengan itu) tidak bisa melakukan 64-bit integer aritmatika, kode ini tidak untuk aplikasi anda. Jika tidak, saya pikir ini adalah kualitas produksi C kode (mungkin setelah mengubah lama
untuk int32
dan unsigned long long
untuk uint64
). Saya telah menjalankan semalam ini untuk menguji untuk setiap 2^32 menandatangani nilai integer dan tidak ada kesalahan dalam konversi di kedua arah.
Kami memiliki compiler C/linker yang bisa menghasilkan executable dan kami harus melakukan apa yang bisa kami lakukan tanpa setiap stdlib (yang adalah babi). Jadi tidak ada printf()
atau scanf()
. Bahkan tidak sprintf()
atau sscanf()
. Tapi kami masih memiliki antarmuka pengguna untuk mengkonversi basis-10 bilangan ke biner dan kembali. (Kami juga membuat kita sendiri malloc()
-seperti utilitas juga dan kita sendiri transendental fungsi matematika juga.)
Jadi, ini adalah bagaimana saya melakukannya (main
program dan panggilan untuk stdlib berada di sana untuk menguji hal ini pada mac saya, tidak untuk kode tertanam). Juga, karena beberapa yang lebih tua dev sistem don't mengenali "int64
" dan "uint64
" dan jenis yang sama, jenis yang lama
dan unsigned lama
yang digunakan dan diasumsikan sama. Dan panjang
ini diasumsikan untuk menjadi 32 bit. Saya kira saya bisa `typedef indonesia itu.
// returns an error code, 0 if no error,
// -1 if too big, -2 for other formatting errors
int decimal_to_binary(char *dec, long *bin)
{
int i = 0;
int past_leading_space = 0;
while (i <= 64 && !past_leading_space) // first get past leading spaces
{
if (dec[i] == ' ')
{
i++;
}
else
{
past_leading_space = 1;
}
}
if (!past_leading_space)
{
return -2; // 64 leading spaces does not a number make
}
// at this point the only legitimate remaining
// chars are decimal digits or a leading plus or minus sign
int negative = 0;
if (dec[i] == '-')
{
negative = 1;
i++;
}
else if (dec[i] == '+')
{
i++; // do nothing but go on to next char
}
// now the only legitimate chars are decimal digits
if (dec[i] == '\0')
{
return -2; // there needs to be at least one good
} // digit before terminating string
unsigned long abs_bin = 0;
while (i <= 64 && dec[i] != '\0')
{
if ( dec[i] >= '0' && dec[i] <= '9' )
{
if (abs_bin > 214748364)
{
return -1; // this is going to be too big
}
abs_bin *= 10; // previous value gets bumped to the left one digit...
abs_bin += (unsigned long)(dec[i] - '0'); // ... and a new digit appended to the right
i++;
}
else
{
return -2; // not a legit digit in text string
}
}
if (dec[i] != '\0')
{
return -2; // not terminated string in 64 chars
}
if (negative)
{
if (abs_bin > 2147483648)
{
return -1; // too big
}
*bin = -(long)abs_bin;
}
else
{
if (abs_bin > 2147483647)
{
return -1; // too big
}
*bin = (long)abs_bin;
}
return 0;
}
void binary_to_decimal(char *dec, long bin)
{
unsigned long long acc; // 64-bit unsigned integer
if (bin < 0)
{
*(dec++) = '-'; // leading minus sign
bin = -bin; // make bin value positive
}
acc = 989312855LL*(unsigned long)bin; // very nearly 0.2303423488 * 2^32
acc += 0x00000000FFFFFFFFLL; // we need to round up
acc >>= 32;
acc += 57646075LL*(unsigned long)bin;
// (2^59)/(10^10) = 57646075.2303423488 = 57646075 + (989312854.979825)/(2^32)
int past_leading_zeros = 0;
for (int i=9; i>=0; i--) // maximum number of digits is 10
{
acc <<= 1;
acc += (acc<<2); // an efficient way to multiply a long long by 10
// acc *= 10;
unsigned int digit = (unsigned int)(acc >> 59); // the digit we want is in bits 59 - 62
if (digit > 0)
{
past_leading_zeros = 1;
}
if (past_leading_zeros)
{
*(dec++) = '0' + digit;
}
acc &= 0x07FFFFFFFFFFFFFFLL; // mask off this digit and go on to the next digit
}
if (!past_leading_zeros) // if all digits are zero ...
{
*(dec++) = '0'; // ... put in at least one zero digit
}
*dec = '\0'; // terminate string
}
#if 1
#include <stdlib.h>
#include <stdio.h>
int main (int argc, const char* argv[])
{
char dec[64];
long bin, result1, result2;
unsigned long num_errors;
long long long_long_bin;
num_errors = 0;
for (long_long_bin=-2147483648LL; long_long_bin<=2147483647LL; long_long_bin++)
{
bin = (long)long_long_bin;
if ((bin&0x00FFFFFFL) == 0)
{
printf("bin = %ld \n", bin); // this is to tell us that things are moving along
}
binary_to_decimal(dec, bin);
decimal_to_binary(dec, &result1);
sscanf(dec, "%ld", &result2); // decimal_to_binary() should do the same as this sscanf()
if (bin != result1 || bin != result2)
{
num_errors++;
printf("bin = %ld, result1 = %ld, result2 = %ld, num_errors = %ld, dec = %s \n",
bin, result1, result2, num_errors, dec);
}
}
printf("num_errors = %ld \n", num_errors);
return 0;
}
#else
#include <stdlib.h>
#include <stdio.h>
int main (int argc, const char* argv[])
{
char dec[64];
long bin;
printf("bin = ");
scanf("%ld", &bin);
while (bin != 0)
{
binary_to_decimal(dec, bin);
printf("dec = %s \n", dec);
printf("bin = ");
scanf("%ld", &bin);
}
return 0;
}
#endif
#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;
}
Cara mengkonversi desimal ke biner dalam C++. Tapi karena kita menggunakan mod, fungsi ini akan bekerja dalam kasus heksadesimal atau oktal juga. Anda juga dapat menentukan bit. Fungsi ini terus menghitung terendah yang signifikan sedikit dan letakkan di akhir string. Jika anda tidak begitu mirip dengan metode ini dari yang dapat anda kunjungi: https://www.wikihow.com/Convert-from-Decimal-to-Binary ``cpp
menggunakan namespace std;
string itob(int bit, int n) { int c; char s[bit+1]; // +1 untuk menambahkan karakter NULL.
s[bit] = '\0'; // karakter NULL dalam sebuah array karakter bendera akhir string, tidak menambahkan hal itu dapat menyebabkan masalah.
c = bit - 1; // Jika panjang string adalah n, daripada indeks karakter terakhir dari string akan n - 1. Penyebab indeks adalah 0 tidak didasarkan 1 yang berdasarkan. Mencoba sendiri.
do { if(n%2) s[c] = '1'; lain s[c] = '0'; n /= 2; c--; } while (n>0);
sedangkan(c > -1) { s[c] = '0'; c--; }
return s; }
int main() { cout << itob(1, 0) << endl; // 0 dalam 1 bit biner. cout << itob(2, 1) << endl; // 1 2 bit biner. cout << itob(3, 2) << endl; // 2 dalam 3 bit biner. cout << itob(4, 4) << endl; // 4 dalam 4 bit biner. cout << itob(5, 15) << endl; // 15 dalam 5 bit biner. cout << itob(6, 30) << endl; // 30 dalam 6 bit biner. cout << itob(7, 61) << endl; // 61 di 7 bit biner. cout << itob(8, 127) << endl; // 127 dalam 8 bit biner. return 0; } ``
Output:
Nol 01 010 0100 01111 011110 0111101 01111111
Oke.. saya mungkin sedikit baru untuk C++, tapi aku merasa seperti contoh di atas don't cukup mendapatkan pekerjaan yang dilakukan dengan benar.
Berikut's saya ambil pada situasi ini.
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;
}
@nilai = Nilai kami memeriksa.
@bit_precision = tertinggi kiri paling sedikit untuk memeriksa.
@Panjang = Maksimum Byte Ukuran Blok. E. g. 7 = 1 Byte dan 9 = 2 Byte, tapi kita merepresentasikan dalam bentuk bit sehingga 1 Byte = 8 Bit.
@biner = hanya beberapa bodoh nama yang saya berikan untuk memanggil array dari karakter kita setting. Kami menetapkan ini untuk statis sehingga tidak't dapat diciptakan dengan setiap panggilan. Untuk hanya mendapatkan hasil dan menampilkan hal-hal yang baik, tetapi jika let's mengatakan anda ingin menampilkan beberapa hasil di UI mereka semua akan muncul sebagai hasil terakhir. Hal ini dapat diperbaiki dengan menghilangkan statis, tapi pastikan anda hapus [] hasil ketika anda selesai dengan itu.
@begin = Ini adalah yang terendah indeks yang kami memeriksa. Segala sesuatu di luar titik ini diabaikan. Atau seperti yang ditunjukkan dalam 2 lingkaran diatur ke 0.
@loop pertama - di Sini kita menetapkan nilai 48 dan pada dasarnya tambahkan 0 atau 1 untuk 48 berdasarkan bool nilai (nilai & bit_value) == bit_value. Jika ini benar char diatur ke 49. Jika ini adalah palsu char diatur ke 48. Kemudian kita menggeser bit_value atau pada dasarnya kalikan dengan 2.
@kedua loop - di Sini kita mengatur semua indeks kami diabaikan 48 atau '0'.
BEBERAPA CONTOH OUTPUT!!!
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.
TES KECEPATAN
Pertanyaan yang asli's Jawaban: "Metode: toBinary(int);,"
Eksekusi: 10,000 , Total Waktu (Milli): 4701.15 , Rata-Rata Waktu (Nanodetik): 470114
Versi saya: "Metode: DecimalToBinary(int, int);,"
//Menggunakan 64 Bit Presisi.
Eksekusi: 10,000,000 , Total Waktu (Milli): 3386 , Rata-Rata Waktu (Nanodetik): 338
//Menggunakan 1 Bit Presisi.
Eksekusi: 10,000,000, Total Waktu (Milli): 634, Rata-Rata Waktu (Nanodetik): 63
#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;
}
ini adalah cara sederhana untuk mendapatkan bentuk biner dari int. kredit untuk learncpp.com. im yakin ini bisa digunakan dalam berbagai cara untuk sampai ke titik yang sama.
DESIMAL KE BINER TIDAK ada ARRAY yang DIGUNAKAN *dibuat oleh Oya:
I'm masih pemula, jadi kode ini hanya akan menggunakan loop dan variabel xD...
Harap anda menyukainya. Hal ini mungkin dapat dibuat lebih sederhana dari adalah...
#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;
}
di sini converter sederhana dengan menggunakan std::string
sebagai wadah. hal ini memungkinkan nilai negatif.
#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';
}
Ini adalah lebih sederhana **** program dari sebelumnya
//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;
}