續上一篇
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;
}
上述為可以將單一一個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;
}
歡迎大家討論,有什麼更好寫法
改個長度即可
#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
了
好的,感謝海綿大大 對進位制還在慢慢熟悉
海綿大,這樣是可以讓長度變成先定義好靜態變數沒錯
但是如果以我輸入的值為準去決定輸出長度動態變數的話該怎麼做呢
如果上面是你要的結果
程式如下
可以看出
我只有修改最後的輸出「格式」
沒有動到「數值本身」和「進位轉換」
#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;
}