打印二进制位的奇数位和偶数位

我的想法是创建两个数组分别来接受奇数和偶数,再用一个for循环实现代码的录入

结果如下

int main()
{
    int a = 0;
    scanf("%d", &a);
    int odd[16] = { 0 };
    int even[16] = {0};
    int i = 0;
    for (i = 1; i <=32; i--)
    {
        int tmp = 0;
        if (i % 2 == 0)
        {
            tmp = a % 2;
            even[(i / 2-1)] = tmp;
            a /= 2;
        }
        else
        {
            tmp = a % 2;
            odd[(i / 2)] = tmp;
            a /= 2;
        }
    }
    int j = 0;
    for (j = 0; j < 16; j++)
    {
        printf("%d", odd[j]);
    }
    printf("\n");
    int r = 0;
    for (r = 0; r < 16; r++)
    {
        printf("%d", even[r]);
    }
    return 0;

}

怎么说呢,任务确实完成了,但最后的表现形式让我不是很满意

比如我要实现对9这个数的这样一个操作

结果会是

1000000000000000

0100000000000000

很奇怪,因为这两个1都是低位的

虽然我写的代码能完成功能实属不易

但我感觉不太好这个代码

突然发现只要改动一点点就可以改进这个问题

即在将奇偶数位输入到数组时分别用15减去原来的那个下标表达式

结果如下

int main()
{
    int a = 0;
    scanf("%d", &a);
    int odd[16] = { 0 };
    int even[16] = {0};
    int i = 0;
    for (i = 1; i <=32; i++)
    {
        int tmp = 0;
        if (i % 2 == 0)
        {
            tmp = a % 2;
            even[15-(i / 2-1)] = tmp;
            a /= 2;
        }
        else
        {
            tmp = a % 2;
            odd[15-(i / 2)] = tmp;
            a /= 2;
        }
    }
    int j = 0;
    for (j = 0; j < 16; j++)
    {
        printf("%d", odd[j]);
    }
    printf("\n");
    int r = 0;
    for (r = 0; r < 16; r++)
    {
        printf("%d", even[r]);
    }
    return 0;
}

至此我完成了对自己的救赎

但其实获得一个数的最低位的方法不止a%2

还可以与1按位与

于是下面是网课老师的解法

void print(int m)
{
    int i = 0;
    printf("奇数位:\n");
    for (i = 30; i >= 0; i -= 2)
    {
        printf("%d", (m >> i) & 1);
    }
    printf("\n");

    int j = 0;
    printf("偶数位:\n");
    for (j = 31; j >= 1; j -= 2)
    {
        printf("%d", (m >> j) & 1);
    }
}

int main()
{
    int m = 0;
    scanf("%d", &m);
    print(m);
    return 0;
}

其实我感觉两种方法差不太多,但下面的确实精简一点,同时还运用了函数,可以让代码层次更加清晰

小白上路,如有错误,还望指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值