C语言基础编程题(位操作训练)


在这里插入图片描述

1.给出一个字节中被置为1的位的个数

#include <stdio.h>

int main() {
    char c = 0x31;//0011 0001B
    int count = 0;

    for (int i = 0; i < 8; i++) {
        if (c & 0x01)
            count ++;
        c = c >> 1;
    }

    printf("total %d '1'", count);

    return 0;
}

2.输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的第p1到p2位

#include <stdio.h>

void binary_out(int n, int start, int end);

int main() {
    int x = 4 + 16 + 64;//0101 0100B

    binary_out(x, 2, 6);

    return 0;
}

void binary_out(int n, int start, int end) {
    n = n >> start;

    for (int i = 0; i < end -start + 1; i++) {
        printf("%d", (n & 0x1) ? 1 : 0);
        n = n >> 1;
    }
}

3.输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出

#include <stdio.h>

void binary_out(int n, int start, int end);

int main() {
    int x = 4 + 16 + 64;//0101 0100B

    binary_out(x, 2, 6);

    return 0;
}

void binary_out(int n, int start, int end) {
    n = n >> start;

    for (int i = 0; i < end -start + 1; i++) {
        printf("%d", (n & 0x1) ? 0 : 1);
        n = n >> 1;
    }
}

4.输入一个整数a,再输入两个整数p(p<32),v(0或1),将整数a的p位设置为v,输出修改后的该整数的二进制表示

#include <stdio.h>

void binary_out(int n, int p, int v);

int main() {
    int x = 4 + 16 + 64;//0101 0100B

    binary_out(x, 0, 1);

    return 0;
}

void binary_out(int n, int p, int v) {
    for (int i = 0; i < 32; i++) {
        if (i == 31 - p) {
            printf("%d", v);
        }
        else {
            printf("%d", (n & 0x80000000) ? 1 : 0);
        }

        if (i % 4 == 3)
            printf(" ");

        n = n << 1;
    }
}

5.输入一个32位的整数a,使用按位异或运算,生成一个新的32位整数b,使得b的每一位等于a中对应位左右两位的异或结果

#include <stdio.h>

int creat(int n);

int main() {
    int n = 4 + 16 + 64;//0101 0100B

    creat(n);

    return 0;
}

int creat(int n) {
    int x = 0, i;
    int b_n[32] = {0}, b_x[32] = {0};

    /*store the binary style of n in array b_n[]*/
    for (i = 0; i < 32; i++) {
        b_n[i] = (n & 0x80000000) ? 1 : 0;
        b_x[i] = b_n[i];
        n = n << 1;
    }

    /*xor operation*/
    for (i = 1; i < 31; i++) {
        b_x[i] = (b_n[i-1] ^ b_n[i+1]);
    }

    /*binary to decimal*/
    for (i = 0; i < 32; i++) {
        x = x * 2 + b_x[i];
    }


    printf("binary of n:");
    for (i = 0; i < 32; i++) {
        printf("%d", b_n[i]);

        if (i % 4 == 3)
            printf(" ");
    }
    printf("B\n");

    printf("binary of x:");
    for (i = 0; i < 32; i++) {
        printf("%d", b_x[i]);

        if (i % 4 == 3)
            printf(" ");
    }
    printf("B\n");

    printf("decimal of x:%dD", x);
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值