位操作符的编程练习

编程练习
1.统计32位二进制中1的个数
Numberof1()就是计算参数n的二进制补码中1有几个

int Numberof1(unsigned int n)
{
    if (n != 0)
        return 1+Numberof1(n&(n-1));
    else
        return 0;
}

int Numberof1(int n)
{
    int count = 0;
    while (n != 0)
    {
        count++;
        n = n & (n - 1);   //每次丢掉一个1有几个1按位与几次后就不等于-
    }
    return count;
}

int Numberof1(int n)
{
    int count = 0;
    int i = 0;
    for (i = 0; i < 32; i++)
    {
        if ((n >> i) & 1)
        {
            count++;
        }
    }
    return count;
}
 
int main()
{
    int n = 0;
    scanf("%d", &n);
    int ret = Numberof1(n);
    printf("%d\n", ret);
    return 0;
}

2.写一个代码判断一个数字是不是2的n次方
int is_2n(int n)
{
    if ((n & (n - 1))==0)   //去掉了1个1就是0了
        return 1;
    return 0;
}
int is_2n(int n)
{
    int i = 0;
    int onlyone = 0;
    for (i = 0; i < 32; i++)
    {
        if ((n >> i) & 1)
            onlyone++;
        if (onlyone == 2)
            return 0;
    }
    if (onlyone)
        return 1;
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    if (is_2n(n))
    {
        printf("YES!\n");
    }
    else
        printf("NO!\n");
    return 0;
}


3.求m与n二进制中不同位的个数
int dif(int m, int n)
{
    int i = 0, count = 0;
    for (i = 0; i < 32; i++)
    {
        if( ((m>>i)&1) != ((n>>i)&1))
            count++;
    }
    return count;
}

int dif(int m, int n)
{
    int ret = m ^ n;   //相同为0,相异为1
    //统计一下ret的二进制中有几个1,就说明m和n的二进制位中有几个位不同
    int count = 0;
    while (ret != 0)
    {
        count++;
        ret = ret & (ret - 1);
    }
    return count;
}

int main()
{
    int m = 0;
    int n = 0;
    scanf("%d %d", &m, &n);
    printf("%d\n", dif(m, n));
}

4.打印整数二进制的奇数位和偶数位
void classify_print(int n)
{
    int i = 0;
    for (i = 31; i >= 1; i-=2)
    {
        printf("%d", (n >> (i)) & 1);
    }
    printf("\n");
    for (i = 30; i >= 0; i-=2)
    {
        printf("%d",(n >> (i))&1);
    }
}
int main()
{
    int n = 0;
    scanf("%d",&n);
    //获取n的2进制中的奇数位和偶数位
    classify_print(n);
    return 0;
}

5.交换两个变量(不创建临时变量)
void exchange(int* a, int* b)
{
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}
int main()
{
    int a = 3;
    int b = 5;
    exchange(&a, &b);
    printf("a = %d b = %d\n", a, b);
}


操作系统可以使用的最大内存空间
32位平台:2^32字节
64位平台:2^64字节
(一个内存单元是一个字节,32(64)个地址线可以产生2^32(64)个地址,一个地址访问一个内存单元,因此最大2^32(64)(2^64)的最大内存空间)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值