C语言常见位操作编程题

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

相关知识点:

  • & (按位与) :相同位都是1,则为1.如果有一个不为1,则为0 (有0出0)
  • | (按位或) :相同位只要有一个为1,则为1 (有1出1)
  • ~(按位取反):每一位0变1,1变0
  • ^(按位异或):相同位不同,则为1;相同,则为0 (同死(0)异生(1))
  • 右 移:右移一位,相当于除2,并且取整
  • 左 移:左移一位,相当于乘2
在这里插入代码片int main(void)
{
    int num = 0,i,count=0;
    printf("int = ");
    scanf("%d",&num);
    for(i=0;i<8;i++)
    {
        if((num>>i)&1)
            count++;
    }
    printf("count = %d\n",count);
    return 0;
}

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

相关知识点:
int占32位,最大可以赋值为:2147483647。也就是0x7fffffff。
在计算机里我们的规定最高位是符号位。为0是正,为1是负。所以最高位是不可以参加计算的

int main()
{
    int a,p1,p2,i;
    printf("a=");
    scanf("%d%d%d",&a,&p1,&p2);
    for(i=p1;i<=p2;i++)
    {
     /*实际上,是从第1位开始遍历;但是计算机中,从第0位开始*/
        printf("%d",((a>>i-1)&1));
    }
}

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

相关知识点:
data|=(1<<n); 第n位置1
data&=~(1<<n); 第n位置0
data^=(1<<n); 第n位取反
(data>>n)&1; 取第n位的值

int main()
{
    int a,p,v,i;
    printf("input ");
    scanf("%d%d%d",&a,&p,&v);

    if(v==0)
        a &=~(1<<p-1);
    else
        a |= (1<<p-1);
    for(i=31;i>=0;i--)
    {
        printf("%d",((a>>i)&1));
    }
}

4 将二进制数转成整数

int changeDate(char *str)
{
    int sum =0;
    int j = 1;
    /*用作循环上限*/
    int pos = strlen(str) - 1;
    for(;pos>=0;pos--)
    {
        /*刚开始,pos最大,对应的是数组的最右边*/
        sum += (str[pos]-'0')*j;
        j *= 2;
    }
    return sum;
}
int main()
{
    /*字符用单引号,字符串用双引号*/
    int result = 0;
    result = changeDate("111010101011101");
    printf("the number is = %d",result);

    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

One Piece&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值