C语言 编程题(操作符)

C语言学习!

1. 统计二进制中1的个数。

        写一个函数返回参数二进制中1的个数,

        比如:输入15 (0000 1111) 二进制有4个1,输出4.

方法1

编程思路:

得到十进制数字的每一位操作:

  • 如1234
  • 1234 % 10就可以得到原数字1234个位的4
  • 1234 / 10就可以去掉原数字1234个位的4得到123
  • 123 % 10就可以得到原数字1234十位的3
  • 123 / 10就可以去掉原数字1234十位的3得到12
  • 12 % 10就可以得到原数字1234百位的2
  • 12 / 10就可以去掉原数字1234百位的2得到1
  • 1 % 10就可以得到原数字1234千位的1
  • 1 / 10就可以去掉原数字1234千位的1得到0
  • 当数值为0时,不再计算。

最终就可以得到原数字1234的每一位数1、2、3、4。


得到二进制数字的每一位,可以参考上述方法

  • 如十进制数11的二进制数为1011
  • 11 % 2就可以得到1011最低位的1
  • 11 / 2 = 5就可以去掉原数字1011最低位的1得到101
  • 5 % 2就可以得到1011第二位的1
  • 5 / 2 = 2就可以去掉原数字1011第二位的1得到10
  • 2 % 2就可以得到1011第三位的0
  • 2 / 2 = 1就可以去掉原数字1011第三位的0得到1
  • 1 % 2就可以得到第四位的1
  • 1 / 2 = 0就可以去掉原数字1011第四位的1
  • 当数值为0时,不再计算。

最终就可以得到二进制数1011共有3个。

代码示例:

#include <stdio.h>

int Count_num(unsigned int n)
{
    int count = 0;
    while (n != 0)
    {
        if (n % 2 == 1)
        {
            count++;
        }
        n /= 2;
    }

    return count;
}

int main()
{
    int Num = 0;
    scanf("%d", &Num);
    int a = Count_num(Num);
    printf("%d\n", a);
    return 0;
}

运行结果:

15
4
-1
32

        但是这个方法计算负数的二进制1的个数需要注意。
例如-1

  • 1000 0000 0000 0000 0000 0000 0000 0001   原码
  • 1111  1111  1111 1111  1111  1111  1111 1110    反码
  • 1111  1111  1111  1111 1111  1111  1111 1111    补码

        -1在内存中是以补码的形式存放的,如果调用函数传参将有符号数-1当做为无符号数来看,就不会将数(-1补码)首位的1当做负数的符号位来看,而是将数(-1补码)当做一个很大的二进制数来看,就可以得到-1二进制数中1的个数。
        所以这里函数参数为无符号整型。


方法2

        一个数按位与1就可以得到一个数二进制位的最低位是几,让数的每一位都按位与1,就可以得到数二进制中1的个数。

代码示例:

#include <stdio.h>

int Count_num(int n)
{
	int i = 0;
	int count = 0;
	for (i = 0; i < 32; i++)
	{
		if (((n >> i) & 1) == 1)
		{
			count++;
		}
	}
	return count;
}

int main()
{
	int Num = 0;
	scanf("%d", &Num);
	int a = Count_num(Num);
	printf("%d\n", a);
	return 0;
}

运行结果:

15
4
-1
32

方法3

用表达式:n=n&(n-1) 来巧妙计算
 

代码示例:

#include <stdio.h>
int Count_Num(int n)
{
	int count = 0;
	while (n)
	{
		n = n & (n - 1);
		count++;
	}
	return count;
}

int main()
{
	int Num = 0;
	scanf("%d", &Num);
	int n = Count_Num(Num);
	printf("%d\n", n);

	return 0;
}

运行结果:

15
4
-1
32

代码原理:

例如:n=15,表达式与表达式对应的二进制数值如下

第一次循环

  • 1111  n
  • 1110  n-1
  • 1110  n & (n - 1)

第二次循环

  • 1110  n = n & (n - 1)
  • 1101  n-1
  • 1100  n & (n - 1)

第三次循环

  • 1100  n = n & (n - 1)
  • 1011  n-1
  • 1000  n & (n - 1)

第四次循环

  • 1000  n = n & (n - 1)
  • 0111  n-1
  • 0000  n & (n - 1)

        当n=0时,二进制数中就没有1了,在n=0之前,表达式n = n & (n - 1)执行过几次,原数n的二进制数就有几个1,因为表达式执行一次去掉二进制数最右边的一个1.

2.求两个数二进制中不同位的个数。

        两个int(32位)整数m和n的二进制表达式中,有多少个位(bit)不同。

方法1

        m和n每一位都按位与1后比较是否相等。

代码示例:


#include <stdio.h>

int Count_diff_bit(int m, int n)
{
	int count = 0;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if (((m >> i) & 1) != ((n >> i) & 1))
		{
			count++;
		}
	}

	return count;
}


int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	int ret = Count_diff_bit(m, n);
	printf("%d", ret);
	return 0;
}

运行结果:

15
1
3
1
-1
31

方法2

        求出m与n异或的值后,再计算所得值的二进制位1的个数。

        异或:相同为0,不同为1.

代码示例:

#include <stdio.h>

int Count_diff_bit(int m, int n)
{
	int count = 0;
	int num = n ^ m;
	while (num)
	{
		num = num & (num - 1);
		count++;
	}

	return count;
}


int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	int ret = Count_diff_bit(m, n);
	printf("%d", ret);
	return 0;
}

运行结果:

15
14
1
15
-1
28

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/579529.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node.js -- 包管理工具

文章目录 1. 概念介绍2. npm2.1 npm 下载2.2 npm 初始化包2.3 npm 包(1) npm 搜索包(2) npm 下载安装包(3) require 导入npm 包的基本流程 2.4 开发依赖和生产依赖2.5 npm 全局安装(1) 修改windows 执行策略(2) 环境变量Path 2.6 安装包依赖2.7 安装指定版本的包2.8 删除依赖2.…

jenkins教程

jenkins 一、简介二、下载安装三、配置jdk、maven和SSH四、部署微服务 一、简介 Jenkins是一个流行的开源自动化服务器&#xff0c;用于自动化软件开发过程中的构建、测试和部署任务。它提供了一个可扩展的插件生态系统&#xff0c;支持各种编程语言和工具。 Jenkins是一款开…

PotatoPie 4.0 实验教程(27) —— FPGA实现摄像头图像拉普拉斯边缘提取

拉普拉斯边缘提取有什么作用&#xff1f; 拉普拉斯边缘检测是一种常用的图像处理技术&#xff0c;用于检测图像中的边缘和边界。它的主要作用包括&#xff1a; 边缘检测&#xff1a;拉普拉斯算子可以帮助检测图像中的边缘&#xff0c;即图像中亮度快速变化的位置。这些边缘通常…

前端HTML5学习2(新增多媒体标签,H5的兼容性处理)

前端HTML5学习2新增多媒体标签&#xff0c;H5的兼容性处理&#xff09; 分清标签和属性新增多媒体标签新增视频标签新增音频标签新增全局属性 H5的兼容性处理 分清标签和属性 标签&#xff08;HTML元素&#xff09;和属性&#xff0c;标签定义了内容的类型或结构&#xff0c;而…

RocketMQ 消息重复消费

现象 触发消息后&#xff0c;在1s内收到了两次消息消费的日志。 消息消费日志重复&#xff0c;reconsumeTimes0&#xff0c;主机实例也不同&#xff0c;说明是同一条消息被消费了两次 分析 生产者发送消息的时候使用了重试机制&#xff0c;发送消息后由于网络原因没有收到MQ…

永磁同步电机PMSM负载状态估计simulink模型

永磁同步电机PMSM负载状态估计simulink模型&#xff0c;龙伯格观测器&#xff0c;各种卡尔曼滤波器&#xff0c;矢量控制&#xff0c;坐标变换&#xff0c;永磁同步电机负载转矩估计&#xff0c;pmsm负载转矩测量&#xff0c;负载预测&#xff0c;转矩预测的matlab/simulink仿真…

【C++】---STL容器适配器之queue

【C】---STL容器适配器之queue 一、队列1、队列的性质 二、队列类1、队列的构造2、empty()3、push()4、pop()5、size()6、front()7、back() 三、队列的模拟实现1、头文件&#xff08;底层&#xff1a;deque&#xff09;2、测试文件3、底层&#xff1a;list 一、队列 1、队列的…

【NR RedCap】Release 18标准中对5G RedCap的增强

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

R语言贝叶斯方法在生态环境领域中的应用

贝叶斯统计已经被广泛应用到物理学、生态学、心理学、计算机、哲学等各个学术领域&#xff0c;其火爆程度已经跨越了学术圈&#xff0c;如促使其自成统计江湖一派的贝叶斯定理在热播美剧《The Big Bang Theory》中都要秀一把。贝叶斯统计学即贝叶斯学派是一门基本思想与传统基于…

使用微信开发者工具模拟微信小程序定位

哈喽&#xff0c;各位同僚们&#xff0c;我们平时在测试微信小程序的时候&#xff0c;如果小程序中有获取定位或者地图的功能&#xff0c;测试场景中常常需要去模拟不同的位置&#xff0c;例如我们模拟在电子围栏的外面、里面和边界区域等。那么&#xff0c;我们如何在模拟微信…

[笔试训练](八)

目录 022&#xff1a;求最小公倍数 023&#xff1a;数组中的最长连续子序列 024&#xff1a;字母收集 022&#xff1a;求最小公倍数 求最小公倍数_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 求最小公倍数公式&#xff1a;lcm(a,b)a*b/gcd(a,b)&am…

创建springboot项目的问题

IDEA搭建spring boot时报错Error: Request failed with status code 400 Could not find artifact org.springframework.boot:spring-boot-starter-parent:pom:3.2.5.RELEASE in alimaven (http://maven.aliyun.com/nexus/content/repositories/central/) 原因是父级依赖的版本…

Web前端开发 小实训(一) 成绩分类统计

用于学生web前端开发课程实训练习&#xff0c;掌握基本语法和数据类型 实训目的 使用分支语句&#xff0c;完成分数统计与等级对比,通过输入框输入分数&#xff0c;可以根据分数多少划分等级。 参考思路&#xff1a; 分析题目&#xff1a;根据输入分数进行等级划分。 操作过…

yolov8 dll 编译

1. 每次用yolo v8 都要用python &#xff0c;对于我这种写软件的太不方便了&#xff0c;下面尝试编译dll 调用, 我已经有做好的模型.best.pt 参考视频方法: yolov8 TensorRT C 部署_哔哩哔哩_bilibili 【yolov8】tensorrt部署保姆级教程&#xff0c;c版_哔哩哔哩_bilibili 需…

怎么做视频二维码更方便?在线一键生成视频活码二维码

现在经常会发现很多的二维码可以用来展示视频内容&#xff0c;通过这种方式来实现视频的快速分享与传播。二维码是一种成本低传播快的内容传播方式&#xff0c;很多的内容都可以通过生成二维码的方式来分享给其他人&#xff0c;可以同时扫描相同的二维码来获取内容&#xff0c;…

电脑的无用设置功能(建议关闭)

目录 1、传递优化 ​2、常规​ 3、电源 1、传递优化 2、常规3、电源

Vue2和Vue3的生命周期对比

beforeCreate 、created 两个钩子被setup()钩子来替代。 所有生命周期前面加了on

【Kotlin】Channel简介

1 前言 Channel 是一个并发安全的阻塞队列&#xff0c;可以通过 send 函数往队列中塞入数据&#xff0c;通过 receive 函数从队列中取出数据。 当队列被塞满时&#xff0c;send 函数将被挂起&#xff0c;直到队列有空闲缓存&#xff1b;当队列空闲时&#xff0c;receive 函数将…

PotatoPie 4.0 实验教程(41) —— FPGA实现RISC-V 扩展 GPIO UART Timer功能

TD工程介绍 我们提供的TD工程里的RISC-V核默认就开启了GPIO UART扩展&#xff0c;可以看到还有SPI和I2C扩展。因此后面的实验中TD的工程我们基本不怎么修改TD的内容&#xff0c;只需要修改TD工具中Soc_Top.v文件中的TCM0_INITFILE为FD生成的固件名称即可&#xff0c;主要修我以…

数据集市的详细建设方案!

▶ 什么是数据集市&#xff1f; 数据集市是处理单一事务的数据仓库的子集。它们通常由单个业务部门构建和管理。由于它们是面向主题的&#xff0c;因此通常仅从少数来源获取数据&#xff0c;这些来源可能是内部操作系统&#xff0c; 数据湖&#xff0c;一个集中的 数据存储库&a…
最新文章