二进制中的位运算

1.写一个函数返回参数二进制中 1 的个数
比如: 15 0000 1111 4 个 1
程序原型:
int count_one_bits(unsigned int value)
{
返回 1的位数
}

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

////方法1
//int count_one_bits(unsigned int value)
//{
//  int count = 0;
//  while (value)
//  {
//      if (value % 2 == 1)
//      {
//          count++;
//      }
//      value = value / 2;
//  }
//  return count;
//}

////方法2
//int count_one_bits(unsigned int value)
//{
//  int count = 0;
//  int i = 0;
//  for (i = 0; i < 32; i++)
//  {
//      if (((value >> i) & 1) == 1)//右移移 i 相当于除以 2^i
//          count++;
//  }
//  return count;
//}
//这个方法要循环32次不够优化

//方法3
int count_one_bits(unsigned int value)
{
    int count = 0;
    while (value)
    {
        count++;
        value = value & (value - 1);
    }
    return count;
}

int main()
{
    int num = 0;
    int ret = 0;
    printf("input a number:\n");
    scanf("%d", &num);
    ret = count_one_bits(num);
    printf("二进制中1的个数 = %d\n", ret);
    system("pause");
    return 0;
} 

程序输出:
这里写图片描述
提示:对于移位运算符,不不要移动负数位,这个是标准未定义的。


2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int list(int n)
{
    int i = 0;
    int j = 0;
    printf("输出奇数序列:");
    for (i = 30; i >= 0; i -= 2)
    {
        j = (n >> i) & 1;
        printf("%d", j);
    }
    printf("\n");
    printf("输出偶数序列:");
    for (i = 31; i >= 0; i -= 2)
    {
        j = (n >> i) & 1;
        printf("%d", j);
    }
    printf("\n");
}

int main()
{
    int num = 0;
    int ret = 0;
    printf("请输入一个数字:\n");
    scanf("%d", &num);
    ret = list(num);
    printf("\n");
    system("pause");
    return 0;
}

程序输出:
这里写图片描述


3.两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子 :1999 2299 输出例子 : 7

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int count_one_bits(unsigned int value)
{
    int count = 0;
    while (value)
    {
        count++;
        value = value & (value - 1);
    }
    return count;
}

int main()
{
    int a = 0;
    int b = 0;
    int ret = 0;
    printf("input two numbers: \n");
    scanf("%d", &a, &b);
    int num = a ^ b;
    ret = count_one_bits(num);
    printf("两数中不同位(bit)的个数 = %d\n", ret);
    system("pause");
    return 0;
}

程序输出:
这里写图片描述


猜你喜欢

转载自blog.csdn.net/zhang21722668/article/details/81585461