老师布置了一个C++作业

时间:2022-03-28 21:56:29
编写一个任意的八位二进制转换成八进制数和十六进制程序,求给位高手帮帮忙

11 个解决方案

#1


先换成十进制 在转换成八进制十六进制啊

#2


二进制:11111111
八进制:11,111,111 = 377
               3   7    7
十六进制:1111,1111 = FF
                   F       F

#3


char input[9] = "10010000";
int x = 0;
for (int i = 0; i < 8; x = x << 1 | input[i] & 1, i++);
printf("%o %x\n", x, x);


我只是来吐槽的...

#4


顶二楼!用一个数组存储所二进制,然后从左到有按二楼那样计算,编程实现也不难。

#5


可以先换成十进制数,然后再转换成八进制和十六进制

#6


引用 3 楼 bluewanderer 的回复:
C/C++ code
char input[9] = "10010000";
int x = 0;
for (int i = 0; i < 8; x = x << 1 | input[i] &amp; 1, i++);
printf("%o %x\n", x, x);


我只是来吐槽的...


看看这个多给力,printf或者sprintf都有如此强大的能力,外加霍纳法则将任何进制数转化成10进制。

#7


先按权相加,转化成十进制。

然后 printf("%o %x",n,n);

就行了

#8


参考一下?
#include <stdio.h>
#define LEN (sizeof(int)*8)
#define DEBUG 0
void read_bin(int*);
int  read_bint(const char *);
int main(void)
{
    int a;
    #if DEBUG
    char s[LEN+1];
    #endif
    while(8)
    {
        #if DEBUG
        printf("请输入二进制字符串:");
        rewind(stdin);
        fgets(s,LEN+1,stdin);
        a=read_bint(s);
        #else
        printf("请输入二进制数:");
        rewind(stdin);
        read_bin(&a);
        #endif
        printf("十进制值为:%d\n",a);

    }
    return 0;
}
void read_bin(int *p)
{
    int ch,i=0;
    char str[LEN]={0};
    while((ch=getchar())!=EOF&&i<LEN)
    {
        if(ch=='1'||ch=='0')
            str[i++]=ch;
        else break;
    }
    for(*p=0,i=0;i<LEN&&str[i]!='\0';i++)
        *p=(*p)*2+(str[i]-'0');
}
int read_bint(const char *str)
{
    int i,c=0;
    for(i=0;i<LEN&&str[i]!='\0';i++)
        {
            if(str[i]=='1'||str[i]=='0')
                c=c*2+(str[i]-'0');
            else break;
        }

#9


给你一个把8位的数转成16进制的宽字符文字的高效方法,八进制的类似

WCHAR ToHex[256][3]= {L"00", L"01", L"02", L"03", L"04", L"05", L"06", L"07", L"08", L"09", L"0A", L"0B", L"0C", L"0D", L"0E", L"0F", L"10", L"11", L"12", L"13", L"14", L"15", L"16", L"17", L"18", L"19", L"1A", L"1B", L"1C", L"1D", L"1E", L"1F", L"20", L"21", L"22", L"23", L"24", L"25", L"26", L"27", L"28", L"29", L"2A", L"2B", L"2C", L"2D", L"2E", L"2F", L"30", L"31", L"32", L"33", L"34", L"35", L"36", L"37", L"38", L"39", L"3A", L"3B", L"3C", L"3D", L"3E", L"3F", L"40", L"41", L"42", L"43", L"44", L"45", L"46", L"47", L"48", L"49", L"4A", L"4B", L"4C", L"4D", L"4E", L"4F", L"50", L"51", L"52", L"53", L"54", L"55", L"56", L"57", L"58", L"59", L"5A", L"5B", L"5C", L"5D", L"5E", L"5F", L"60", L"61", L"62", L"63", L"64", L"65", L"66", L"67", L"68", L"69", L"6A", L"6B", L"6C", L"6D", L"6E", L"6F", L"70", L"71", L"72", L"73", L"74", L"75", L"76", L"77", L"78", L"79", L"7A", L"7B", L"7C", L"7D", L"7E", L"7F", L"80", L"81", L"82", L"83", L"84", L"85", L"86", L"87", L"88", L"89", L"8A", L"8B", L"8C", L"8D", L"8E", L"8F", L"90", L"91", L"92", L"93", L"94", L"95", L"96", L"97", L"98", L"99", L"9A", L"9B", L"9C", L"9D", L"9E", L"9F", L"A0", L"A1", L"A2", L"A3", L"A4", L"A5", L"A6", L"A7", L"A8", L"A9", L"AA", L"AB", L"AC", L"AD", L"AE", L"AF", L"B0", L"B1", L"B2", L"B3", L"B4", L"B5", L"B6", L"B7", L"B8", L"B9", L"BA", L"BB", L"BC", L"BD", L"BE", L"BF", L"C0", L"C1", L"C2", L"C3", L"C4", L"C5", L"C6", L"C7", L"C8", L"C9", L"CA", L"CB", L"CC", L"CD", L"CE", L"CF", L"D0", L"D1", L"D2", L"D3", L"D4", L"D5", L"D6", L"D7", L"D8", L"D9", L"DA", L"DB", L"DC", L"DD", L"DE", L"DF", L"E0", L"E1", L"E2", L"E3", L"E4", L"E5", L"E6", L"E7", L"E8", L"E9", L"EA", L"EB", L"EC", L"ED", L"EE", L"EF", L"F0", L"F1", L"F2", L"F3", L"F4", L"F5", L"F6", L"F7", L"F8", L"F9", L"FA", L"FB", L"FC", L"FD", L"FE", L"FF"};

使用:
wcout<<ToHex[123];

#10



#define LEN (2*sizeof(int))

 void zwhex16(int n)                 /*输出16进制函数*/
{
    char *hex="0123456789ABCDEF";
    int i=LEN-1;
    char b[LEN];
    while (i>=0)
    {
        b[i--]=(n&0xf);
        n>>=4;
    }
    printf("\n16进制为:0x");
    for (i=0;i<LEN;i++)
        putchar(hex[b[i]]);
}

#11


已经OK了,谢谢各位帮忙!

#1


先换成十进制 在转换成八进制十六进制啊

#2


二进制:11111111
八进制:11,111,111 = 377
               3   7    7
十六进制:1111,1111 = FF
                   F       F

#3


char input[9] = "10010000";
int x = 0;
for (int i = 0; i < 8; x = x << 1 | input[i] & 1, i++);
printf("%o %x\n", x, x);


我只是来吐槽的...

#4


顶二楼!用一个数组存储所二进制,然后从左到有按二楼那样计算,编程实现也不难。

#5


可以先换成十进制数,然后再转换成八进制和十六进制

#6


引用 3 楼 bluewanderer 的回复:
C/C++ code
char input[9] = "10010000";
int x = 0;
for (int i = 0; i < 8; x = x << 1 | input[i] &amp; 1, i++);
printf("%o %x\n", x, x);


我只是来吐槽的...


看看这个多给力,printf或者sprintf都有如此强大的能力,外加霍纳法则将任何进制数转化成10进制。

#7


先按权相加,转化成十进制。

然后 printf("%o %x",n,n);

就行了

#8


参考一下?
#include <stdio.h>
#define LEN (sizeof(int)*8)
#define DEBUG 0
void read_bin(int*);
int  read_bint(const char *);
int main(void)
{
    int a;
    #if DEBUG
    char s[LEN+1];
    #endif
    while(8)
    {
        #if DEBUG
        printf("请输入二进制字符串:");
        rewind(stdin);
        fgets(s,LEN+1,stdin);
        a=read_bint(s);
        #else
        printf("请输入二进制数:");
        rewind(stdin);
        read_bin(&a);
        #endif
        printf("十进制值为:%d\n",a);

    }
    return 0;
}
void read_bin(int *p)
{
    int ch,i=0;
    char str[LEN]={0};
    while((ch=getchar())!=EOF&&i<LEN)
    {
        if(ch=='1'||ch=='0')
            str[i++]=ch;
        else break;
    }
    for(*p=0,i=0;i<LEN&&str[i]!='\0';i++)
        *p=(*p)*2+(str[i]-'0');
}
int read_bint(const char *str)
{
    int i,c=0;
    for(i=0;i<LEN&&str[i]!='\0';i++)
        {
            if(str[i]=='1'||str[i]=='0')
                c=c*2+(str[i]-'0');
            else break;
        }

#9


给你一个把8位的数转成16进制的宽字符文字的高效方法,八进制的类似

WCHAR ToHex[256][3]= {L"00", L"01", L"02", L"03", L"04", L"05", L"06", L"07", L"08", L"09", L"0A", L"0B", L"0C", L"0D", L"0E", L"0F", L"10", L"11", L"12", L"13", L"14", L"15", L"16", L"17", L"18", L"19", L"1A", L"1B", L"1C", L"1D", L"1E", L"1F", L"20", L"21", L"22", L"23", L"24", L"25", L"26", L"27", L"28", L"29", L"2A", L"2B", L"2C", L"2D", L"2E", L"2F", L"30", L"31", L"32", L"33", L"34", L"35", L"36", L"37", L"38", L"39", L"3A", L"3B", L"3C", L"3D", L"3E", L"3F", L"40", L"41", L"42", L"43", L"44", L"45", L"46", L"47", L"48", L"49", L"4A", L"4B", L"4C", L"4D", L"4E", L"4F", L"50", L"51", L"52", L"53", L"54", L"55", L"56", L"57", L"58", L"59", L"5A", L"5B", L"5C", L"5D", L"5E", L"5F", L"60", L"61", L"62", L"63", L"64", L"65", L"66", L"67", L"68", L"69", L"6A", L"6B", L"6C", L"6D", L"6E", L"6F", L"70", L"71", L"72", L"73", L"74", L"75", L"76", L"77", L"78", L"79", L"7A", L"7B", L"7C", L"7D", L"7E", L"7F", L"80", L"81", L"82", L"83", L"84", L"85", L"86", L"87", L"88", L"89", L"8A", L"8B", L"8C", L"8D", L"8E", L"8F", L"90", L"91", L"92", L"93", L"94", L"95", L"96", L"97", L"98", L"99", L"9A", L"9B", L"9C", L"9D", L"9E", L"9F", L"A0", L"A1", L"A2", L"A3", L"A4", L"A5", L"A6", L"A7", L"A8", L"A9", L"AA", L"AB", L"AC", L"AD", L"AE", L"AF", L"B0", L"B1", L"B2", L"B3", L"B4", L"B5", L"B6", L"B7", L"B8", L"B9", L"BA", L"BB", L"BC", L"BD", L"BE", L"BF", L"C0", L"C1", L"C2", L"C3", L"C4", L"C5", L"C6", L"C7", L"C8", L"C9", L"CA", L"CB", L"CC", L"CD", L"CE", L"CF", L"D0", L"D1", L"D2", L"D3", L"D4", L"D5", L"D6", L"D7", L"D8", L"D9", L"DA", L"DB", L"DC", L"DD", L"DE", L"DF", L"E0", L"E1", L"E2", L"E3", L"E4", L"E5", L"E6", L"E7", L"E8", L"E9", L"EA", L"EB", L"EC", L"ED", L"EE", L"EF", L"F0", L"F1", L"F2", L"F3", L"F4", L"F5", L"F6", L"F7", L"F8", L"F9", L"FA", L"FB", L"FC", L"FD", L"FE", L"FF"};

使用:
wcout<<ToHex[123];

#10



#define LEN (2*sizeof(int))

 void zwhex16(int n)                 /*输出16进制函数*/
{
    char *hex="0123456789ABCDEF";
    int i=LEN-1;
    char b[LEN];
    while (i>=0)
    {
        b[i--]=(n&0xf);
        n>>=4;
    }
    printf("\n16进制为:0x");
    for (i=0;i<LEN;i++)
        putchar(hex[b[i]]);
}

#11


已经OK了,谢谢各位帮忙!