0%

操作符练习

文章时效性提示

本文发布于 514 天前,部分信息可能已经改变,请注意甄别。

统计一个数字的二进制中1的个数

例如:15的二进制是0000 1111,有4个1
方法1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
int main() {
    int x = 0;
    int a = 0;
    int y = 0;
    printf("计算一个数字的二进制中1的个数\n");
    printf("请输入一个数字:->");
    scanf("%d",&x);
    y = x;
    if (x>=0)
    {
        while(x)
        {
            if ( x % 2 == 1 )
            {
                a++;
            }
            x = x / 2;
        }
    }else
    {
        x = -(x);
        while(x)
        {
            if ( x % 2 == 1 ) {
                a++;
            }
            x = x / 2;
        }
        a = 32 - a;
        a = a + 1;
    }
    printf("%d的二进制中有%d个1\n",y,a);
    return 0;
}

方法2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int main() {
    int x = 0;
    int a = 0;
    int y = 0;
    int i = 0;
    printf("计算一个数字的二进制中1的个数\n");
    printf("请输入一个数字:->");
    scanf("%d",&x);
    y = x;
    for (i=0; i<32; i++)
    {
      if (((x >> i) & 1) == 1) //这一步得到这个数字的二进制中的1位数字是1还是0
      {
            a++;
       }
    }
    printf("%d的二进制中有%d个1\n",y,a);
    return 0;
}

方法3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main() {
    int x = 0;
    int a = 0;
    int y = 0;
    int i = 0;
    printf("计算一个数字的二进制中1的个数\n");
    printf("请输入一个数字:->");
    scanf("%d",&x);
    y = x;
    while (x) {
        x = x & (x-1);
        a++;
    }
    printf("%d的二进制中有%d个1\n",y,a);
    return 0;
}

相关:负数的二进制计算


统计两个数字的二进制中不同位数的个数

方法1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main() {
    int a;
    int b = 0;
    int x,y;
    printf("计算两个数字的二进制中不同位的个数\n");
    printf("请输入两个数字:->");
    scanf("%d%d",&x,&y);
    for (a = 0; a<32; a++) {
        if (((x>>a) & 1) != ((y>>a) & 1)) {
            b++;
        }
    }
    printf("有%d个不同的位数\n",b);
    return 0;
}

方法2:利用按位异或^的特性统计二进制中1的个数。
相关:按位异或

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int main() {
    int c;
    int b = 0;
    int x,y;
    printf("计算两个数字的二进制中不同位的个数\n");
    printf("请输入两个数字:->");
    scanf("%d%d",&x,&y);
    c = x ^ y;
    while(c)
            {
                if ( c % 2 == 1 )
                    {
                        b++;
                    }
                c = c / 2;
            }
    printf("有%d个不同的位数\n",b);
    return 0;
}

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

获取一个整数二进制的所有偶数位和奇数位,分别打印出二进制序列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main() {
    int a;
    int x = 0;
    printf("打印二进制的奇数位和偶数位\n");
    printf("请输入数字:->");
    scanf("%d",&x);
    printf("奇数位:");
    for (a = 30; a>=0; a -= 2)
    {
        printf("%d ",(x>>a)&1);
    }
    printf("\n");
    printf("偶数位:");
    for (a = 31; a>=0; a -= 2)
    {
        printf("%d ",(x>>a)&1);
    }
    printf("\n");
    return 0;
}

使用指针打印数组内容

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main()
{
    int i;
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int sz = sizeof(arr)/sizeof(arr[0]) - 1;
    int* p = arr;
    for (i=0; i<=sz; i++) {
        printf("%d ",*p+i);
    }
    return 0;
}

相关:交换两个变量的值,不使用第三个变量