欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言格式輸出二進(jìn)制的2種方法總結(jié)

 更新時(shí)間:2022年08月11日 10:15:37   作者:IT狼~  
眾所周知C中以八進(jìn)制,十進(jìn)制和十六進(jìn)制都可以通過%o,%d和%x輕松實(shí)現(xiàn),然而唯獨(dú)沒有提供二進(jìn)制輸出的快速方式,下面這篇文章主要給大家介紹了關(guān)于C語言格式輸出二進(jìn)制的2種方法,需要的朋友可以參考下

1.前言

在我們?nèi)粘5木幊讨校袝r(shí)候需要格式化輸出一個(gè)整形數(shù)據(jù)的二進(jìn)制,但是在我們C語言中只有

  • 輸出十進(jìn)制:%d
  • 輸出十六進(jìn)制:%x;
  • 輸出單個(gè)字符:%c;
  • 輸出字符串:%s;
  • 輸出變量所在的地址:%p;

而并沒有這種二進(jìn)制對應(yīng)的格式,所以需要我們手動來實(shí)現(xiàn)。

2.源碼實(shí)現(xiàn)

本篇博客給大家介紹兩種方法:

1.通過庫函數(shù)itoa,需要包含頭文件:#include <stdlib.h>;

2.通過十進(jìn)制轉(zhuǎn)成二進(jìn)制的常用方法——短除法;

為方便大家使用,將兩種方法都封裝成了函數(shù),源碼如下:

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

#define uint32 unsigned int
#define uint8 unsigned char

void FuncOutputBin(uint32 value)
{
	char string[33];   //形參類型uint32最大為32位,因此我這里定義了大小為33的字符串?dāng)?shù)組存放
	itoa(value, string, 2);  
	printf("庫函數(shù)得到的二進(jìn)制為:%s\r\n",string);
}

//用短除法的思想得到二進(jìn)制,之后將數(shù)據(jù)從后往前讀取 
void ShortDivOutputBin(uint32 input)
{
	uint8 temp[33] = {0};  
	int i = 0;
	printf("短除法得到的二進(jìn)制為:");
	while(input)
	{
		temp[i] = input % 2;	//取余數(shù)存放到數(shù)組中,此為得到的二進(jìn)制數(shù)
		input = (uint32)input / 2;  //短除,while中判斷是否除盡
		i++;  //存儲了一個(gè)二進(jìn)制數(shù),自加存儲下一個(gè)
	}
	for(i--; i>=0; i--)  //由于最后一次input為0無效,i還是自加了,因此最后一次自加的值是無用的,所以先自減,然后將余數(shù)從后往前讀取
    {
		printf("%d",temp[i]);
	}
	printf("\r\n");
}

void main(void)
{
	uint32 input = 0;
	printf("請輸入一個(gè)需要轉(zhuǎn)化為2進(jìn)制的整形數(shù)據(jù):");
	scanf("%d", &input); 
	FuncOutputBin(input);
	ShortDivOutputBin(input);	
} 

itoa函數(shù)原型:char *itoa( int value, char *string,int radix)
功能:將整形數(shù)據(jù)value轉(zhuǎn)化成需要的進(jìn)制radix,然后將之以字符串的形式存放在string中;
返回值:轉(zhuǎn)化成對應(yīng)進(jìn)制后的字符串的地址,也可以不使用返回值;
它的三個(gè)參數(shù)依次為:
value:需要轉(zhuǎn)化的整形數(shù)據(jù);
string:轉(zhuǎn)化成對應(yīng)進(jìn)制后的字符串的地址;
radix :需要轉(zhuǎn)化的進(jìn)制(我這里需要轉(zhuǎn)化為2進(jìn)制,所以填2);

3.結(jié)果展示

(有圖有真相咯~)

附:C語言如何將一個(gè)數(shù)字的二進(jìn)制形式輸出出來

一. 我們知道由十進(jìn)制轉(zhuǎn)二進(jìn)制的算法,因此可以直接計(jì)算出其二進(jìn)制數(shù)

例如:對3求其二進(jìn)制

int main()
{
	int n = 3;
	int arr[33] = { 0 };//int 型有32個(gè)字節(jié)
	int i = 0;
	while (n > 0)
	{
		arr[i] = n % 2;
		++i;
		n /= 2;
	}
	int k = 0;
	for (k = i-1; k >= 0; k--) //逆序輸出
	{
		printf("%d", arr[k]);
	}
	return 0;
}

二. 因?yàn)閿?shù)字在計(jì)算機(jī)中就是以二進(jìn)制的形式存儲的,那我們也可以通過  位運(yùn)算符  來表示出一個(gè)數(shù)的二進(jìn)制。

用&(按位與)運(yùn)算符,其運(yùn)算原理是對其兩個(gè)操作數(shù)的計(jì)算機(jī)內(nèi)存儲的二進(jìn)制形式(補(bǔ)碼)的對應(yīng)位進(jìn)行按位與,如果1&1結(jié)果是1,其他結(jié)果都是0。

例如 3&5:

int a = 3;
//a: 00000000000000000000000000000011
 
int b = 5;
//b: 00000000000000000000000000000101
 
int c = a & b;
//c: 00000000000000000000000000000001

因此,可以讓一個(gè)數(shù)n&1,然后得到n的二進(jìn)制的第一位的值(如果結(jié)果是1,那n的二進(jìn)制的第一位也是1,如果是0,那第一位是0),然后讓n右移一位n>>1,然后找其第二位。。。。。。然后一直遍歷到第32位。

int main()
{
	int n = 5;
	int i = 0;
	int arr[33] = { 0 };//int 是有32位的
	//從第一位開始依次取n對應(yīng)二進(jìn)制的每一位
	for (i = 1; i <=sizeof(int) * 8; i++)
	{
		arr[i] = n & 1;  
		n=n	>> 1;	 
	}
	//printf("%d\n", i);
	int k = 0;
	//逆序輸出
	for (k = i-1; k >= 1; k--)
	{
		printf("%d", arr[k]);
	}
 
	printf("\n");
	return 0;
}

運(yùn)算結(jié)果:

但是用數(shù)組存,有點(diǎn)麻煩,所以我又改進(jìn)了一下

int main()
{
	int n = 5;//0000000101
	int i = 0;
	int k = 1 << 31;
 
	for (i = 0; i < sizeof(int) * 8; i++)
	{
		printf("%d", -((n & k) >> 31));
		n <<= 1;
	}
 
	printf("\n");
	return 0;
}

 但是我感覺還是有點(diǎn)麻煩,可又想不出更好的方案了。。。。。。

總結(jié)

到此這篇關(guān)于C語言格式輸出二進(jìn)制的2種方法的文章就介紹到這了,更多相關(guān)C語言格式輸出二進(jìn)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • STl中的排序算法詳細(xì)解析

    STl中的排序算法詳細(xì)解析

    全排序即把所給定范圍所有的元素按照大小關(guān)系順序排列。sort采用的是成熟的"快速排序算法"(目前大部分STL版本已經(jīng)不是采用簡單的快速排序,而是結(jié)合內(nèi)插排序算法)
    2013-09-09
  • 一文帶你深入了解C++中的類型轉(zhuǎn)換

    一文帶你深入了解C++中的類型轉(zhuǎn)換

    在C語言中,如果賦值運(yùn)算符左右兩側(cè)類型不同,或者形參與實(shí)參類型不匹配,或者返回值類型與接收返回值類型不一致時(shí),就需要發(fā)生類型轉(zhuǎn)化。本文主要介紹了C++中常見的四個(gè)類型轉(zhuǎn)換,需要的可以參考一下
    2022-12-12
  • C++的dynamic示例代碼詳解

    C++的dynamic示例代碼詳解

    在C++編程中,dynamic_cast 是處理多態(tài)類型轉(zhuǎn)換的關(guān)鍵工具,允許在復(fù)雜繼承結(jié)構(gòu)中安全地將基類指針或引用轉(zhuǎn)換為派生類指針或引用,這篇文章主要介紹了C++的dynamic,需要的朋友可以參考下
    2024-08-08
  • VS2017開發(fā)C語言出現(xiàn)“no_init_all“的解決辦法

    VS2017開發(fā)C語言出現(xiàn)“no_init_all“的解決辦法

    這篇文章介紹了VS2017開發(fā)C語言出現(xiàn)“no_init_all“的解決辦法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • linux c多線程編程實(shí)例代碼

    linux c多線程編程實(shí)例代碼

    這篇文章主要介紹了linux系統(tǒng)中的c多線程編程實(shí)例,大家可以參考使用以下代碼
    2013-11-11
  • C++讀取注冊表的實(shí)現(xiàn)方法

    C++讀取注冊表的實(shí)現(xiàn)方法

    這篇文章主要介紹了C++讀取注冊表的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • C++ DLL實(shí)現(xiàn)循環(huán)播放音樂的示例詳解

    C++ DLL實(shí)現(xiàn)循環(huán)播放音樂的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C++ DLL實(shí)現(xiàn)循環(huán)播放音樂的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2024-03-03
  • VS2019 Nuget找不到包的問題處理

    VS2019 Nuget找不到包的問題處理

    這篇文章主要介紹了VS2019 Nuget找不到包的問題處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C語言 CRITICAL_SECTION用法案例詳解

    C語言 CRITICAL_SECTION用法案例詳解

    這篇文章主要介紹了C語言 CRITICAL_SECTION用法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言簡單實(shí)現(xiàn)求n階勒讓德多項(xiàng)式的方法

    C語言簡單實(shí)現(xiàn)求n階勒讓德多項(xiàng)式的方法

    這篇文章主要介紹了C語言簡單實(shí)現(xiàn)求n階勒讓德多項(xiàng)式的方法,涉及C語言復(fù)雜浮點(diǎn)數(shù)運(yùn)算的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-05-05

最新評論