iT邦幫忙

0

用C 轉值問題

  • 分享至 

  • xImage

續上一篇
https://ithelp.ithome.com.tw/questions/10206450

#include <stdio.h>

int main(void)
{
    int i, n;
    char data[5];
    
    printf("enter a number to conversion 8 bit value:\n");
    scanf("%x", &n); // %x 允許 16 進位數字
    
    //利用位元運算轉換數值為二進位字串
    for(i=0; i<4; ++i) {
        data[i] = n & 1 << 3 - i ? '1' : '0';
    }
    data[4] = '\0';

    printf("the number of 8 bit value:\n");
    printf("%s\n", data);
    return 0;
}

https://ithelp.ithome.com.tw/upload/images/20211228/20137810frj5yyHyYG.png

上述為可以將單一一個decimal值轉化為四位數binary值
但是如果我想不只轉化一個值
轉化的範圍僅為數字1~9,以及文字a~f,A~F
如果出現其他值應該要為判定出錯
例如我想輸入FFF
輸出要為
1111 1111 1111
而輸入1111
輸出要為
0001 0001 0001 0001

該怎麼做呢?
原本想去抓字串長度去做迴圈的
但是這邊使用位址去表示
大家有什麼想法呢?

更新

用while迴圈去抓出長度了
也可以將二進制與十六進制來回轉換

  int main(){
  char sel[100];
    char num[100];
    int len;
    int f=1;
    while(f==1)
    {
        printf("Please input selection :\n");
        scanf("%s",sel);
        if((sel[0]!='1' && sel[0]!='2') || sel[1]!='\0')
        {
            printf("Select Error!\n");
            continue;
        }
        printf("Please input number : \n");
        scanf("%s",num);
        len=0;

        //從0開始去跑num[]陣列裡面的長度 num[0]、num[1]
        while(len<100)
        {
            if(num[len]=='\0')
        //碰到0就跳出迴圈
                break;
            len++;
        }
        f=0;
        //選項1.0~9, a~f, A~F轉換為bitvalue需要的條件設定
        if(sel[0]=='1')
        {
            int i =0;
            while(i<len)
            {
        //新增條件,一樣由len去抓字串長度檢查裡面的值是否符合條件
                if((num[i]<'0'||num[i]>'9')&&(num[i]<'A'||num[i]>'F')&&(num[i]<'a'||num[i]>'f'))
                {
                    printf("Number Error\n");
                    f=1;
                    break;
                }
                i++;
            }
        }
        //選項2. binary轉bitvalue條件
        else
        {
            if(len%4!=0)
            {
                printf("Number Error\n");
                f=1;
                continue;
            }
            int i=0;
            while(i<len)
            {
                if(num[i]!='0'&&num[i]!='1')
                {
                    printf("Number Error\n");
                    f=1;
                    break;
                }
                i++;
            }
        }
    }// while main loop end 
    
    //選項1,由文數字轉換成bitvalue
    if(sel[0]=='1')
    {
        int i=0;
        while(i<len)
        {
            int temp;
            if(num[i]>='0' && num[i]<='9')
                temp = num[i]-'0';
            else if(num[i]>='A' && num[i]<='F')
                temp = num[i]-'A'+10;
            else 
                temp = num[i]-'a'+10;
            int j=3;
            while(j>=0)
            {
                printf("%d",(temp>>j)&1);
                j--;
            }
            i++;
        }
    }
    //選項2, 由bitvalue轉回文數字
    else
    {
        int temp=0;
        int i =0;
        while(i<len)
        {
            temp=(temp<<1)+num[i]-'0';
            if((i+1)%4==0)
            {
                printf("%X",temp);
                temp=0;
            }
            i++;
        }
    }
    printf("\n");
    return;
  }

歡迎大家討論,有什麼更好寫法

參考同事寫法
這樣就可以互相轉換了
各位有什麼更好的做法歡迎討論
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2021-12-29 09:38:26
最佳解答

https://ithelp.ithome.com.tw/upload/images/20211229/20001787tOXATwlZbA.png

改個長度即可

#include <stdio.h>
#define	BITLEN	16

int main(void)
{
    int i, n;
    char data[BITLEN+1];
    
    printf("enter a number:\n");
    scanf("%x", &n); // %x 允許 16 進位數字
    
    //利用位元運算轉換數值為二進位字串
    for(i=0; i<BITLEN; ++i) {
        data[i] = n & 1 << ((BITLEN-1) - i) ? '1' : '0';
    }
    data[BITLEN] = '\0';

    printf("the binary expression:\n");
    printf("%s\n", data);
    return 0;
}

另外拜託你一件事
題目從頭到尾都是「同一個數字,以2進位表示和以16進位表示」
不要再說什麼8 bit
/images/emoticon/emoticon33.gif

看更多先前的回應...收起先前的回應...

好的,感謝海綿大大 對進位制還在慢慢熟悉
/images/emoticon/emoticon68.gif

/images/emoticon/emoticon55.gif

海綿大,這樣是可以讓長度變成先定義好靜態變數沒錯
但是如果以我輸入的值為準去決定輸出長度動態變數的話該怎麼做呢

https://ithelp.ithome.com.tw/upload/images/20211229/20001787mcENl2ynU2.png

如果上面是你要的結果
程式如下
可以看出
我只有修改最後的輸出「格式」
沒有動到「數值本身」和「進位轉換」

#include <stdio.h>
#define	BITLEN	16

int main(void)
{
    int i, n;
    char data[BITLEN+1];
    
    printf("enter a number:\n");
    scanf("%x", &n); // %x 允許 16 進位數字
    
    //利用位元運算轉換數值為二進位字串
    for(i=0; i<BITLEN; ++i) {
        data[i] = n & 1 << ((BITLEN-1) - i) ? '1' : '0';
    }
    data[BITLEN] = '\0';

    printf("the binary expression:\n");
	int print=0;
    for(i=0; i<BITLEN-3; i=i+4) {
    	if (print) {
    		printf("%c%c%c%c",data[i],data[i+1],data[i+2],data[i+3]);
    	} else {
    		if ((data[i]=='1')||(data[i+1]=='1')||(data[i+2]=='1')||(data[i+3]=='1')) {
    			printf("%c%c%c%c",data[i],data[i+1],data[i+2],data[i+3]);
    			print = 1;
    		}
    	}
    }
    printf("\n");
    return 0;
}

嗯..我希望執行的結果是可以以輸入的字串長度去選擇要編譯顯示出多少長度的binary
你這樣應該只有最長到16也就是只能轉出四個值吧?
如果我想使長度為動態,是否可能要考慮使用while回圈去抓長度?

我希望執行的結果是可以以輸入的字串長度

你終於說到關鍵了,是字串長度
如果是字串
那就使用迴圈(while 或 for 都可以)去寫就好了
將 0..9,A..F 建一個對照表 0000,0001,...1110,1111
然後一個字元一個字元去查表輸出即可

https://ithelp.ithome.com.tw/upload/images/20211229/20137810xQqkkImVbg.png

做出來了 二進制與十六進制互轉,可以再幫看看程式碼是否能再簡化

我要發表回答

立即登入回答