-
输出整数的每一位&两个整数二进制表达中不同的bit位个数&c语言操作符总结
2018-03-30 11:56:17输出整数的每一位 #include <stdio.h> #include <math.h> int main() { int i = 0; int y = 0; int j = 0; int z = 0; int x = 0; scanf("%d",&i); j = i...输出整数的每一位
#include <stdio.h> #include <math.h> int main() { int i = 0; int y = 0; int j = 0; int z = 0; int x = 0; scanf("%d",&i); j = i; //计算整数的位数 while(j) { j = j/10; y++; } printf("这个数有%d位\n",y); //输出每个位数上的数 for(x=0; x<y; y--) { z = i/(int)(pow(10,(y-1))); i = i%(int)(pow(10,(y-1))); printf("%d ",z); } return 0; }
两个int整数二进制表中,有多少个bit位不同?
#include <stdio.h> int main() { int x = 0; int y = 0; int i = 0; int j = 0; int count = 0; scanf("%d,%d",&x,&y); i = (sizeof((x>y)?x:y))*8; //计算较大值所占用的bit位 printf("两个数中较大的数字有%d个bit位\n",i); for(j=0; j<i; j++) //用i来控制最大循环次数 { //两个数都与1“与”运算得到两个数的最低位并比较 if((x&1) != (y&1)) { count++; //不同则累计一次 } //两个数都向右右移一位 x = x>>1; y = y>>1; } printf("有%d个位不同\n",count); return 0; }
-
c语言保留小数点后n位_C语言(2)- 定点数和浮点数
2020-12-28 16:18:05在数学的世界里,实数可以涵盖一个数轴上所有的点,它应该可以表示我们在日常生活中碰到的大部分的数。实数分为有理数和无理数,有理数可以表示为两个整数相除,如p/q的形式,整数也是有理数;不能表示为p/q形式的数...(本文为原创,版权归作者所有)
变量的基本类型里包含了整数和小数,它们是如何由一组0和1来表示的呢?
在数学的世界里,实数可以涵盖一个数轴上所有的点,它应该可以表示我们在日常生活中碰到的大部分的数。实数分为有理数和无理数,有理数可以表示为两个整数相除,如p/q的形式,整数也是有理数;不能表示为p/q形式的数为无理数,比如圆周率π或者√2 。任何一个实数都可以用小数来表示,有的数可以表达为有限位数的小数,比如整数,小数部分为0,又比如1/4,小数表示为0.25;大部分实数则无法使用有限位的小数来表示,它们通常是无限循环或者不循环小数。但是在实际的数值计算中,由于物理上的限制,我们需要将这些实数近似为有限位数的数,近似数的位数则代表了这种近似的程度。比如π,如果表示为3.14,则它的有效位数为3位,如果表示为3.1415926,它的有效位数为8位,有效位数越大,近似程度也越高。
在计算机的世界里,一切的数都是二进制的。数的二进制表达常见的有两种方式:定点数和浮点数。
在不考虑符号的情况下,定点数类似于10进制中表示小数的方法,每一位代表2的n次幂,其中n是数位相对于小数点的位置。小数点左侧代表数的整数部分,小数点右侧代表数的纯小数部分,小数点左侧的第一位为0位。如下图所示定点数,它的数值为1*2^3+0*2^2+0*2^1+1*2^0+0*2^(-1)+1*2^(-2) = 9.25。
但是如何表示小数点的位置呢?显然我们没有办法用某一位来标记小数点的位置,一个32位的二进制小数的小数点位置有33种可能,那么至少需要5-6位才能表示,这显然是对内存的很大的浪费。稍后介绍的浮点数会采用其它的方式来标记浮点数中小数点的位置。事实上定点数的小数点位置是事先约定好的,位置是固定的,这也是称之为定点数的原因。整数就是一种最常见的定点数,它的小数点位固定在最后一位之后,也就是没有小数部分。如何约定定点数小数点的位置取决于语言或者程序的具体实现。
如果考虑到符号,那么事情就会变得复杂一些,因为我们需要用指定位置的1位数来表示正数或者负数。定点数利用最高位来表示符号,0代表正数,1代表负数。但并不是增加了1位就能解决问题,我们还要考虑硬件实现的复杂度。实际上,带符号的定点数可以有以下几种表示方式:
· 原码:正数和负数的区别只在符号位,数值部分是相同的
例如:
+7的原码:0000 0111 -7的原码:1000 0111 +0的原码:0000 0000 -0的原码:1000 0000
· 反码:正数的反码与原码相同,负数的反码,符号位为1,数值部分按位取反
例如:
+7的反码:0000 0111 -7的反码:1111 1000 +0的反码:0000 0000 -0的反码:1111 1111
· 补码:正数的补码与原码相同,负数的补码是负数的反码加1
例如:
+7的补码:0000 0111 -7的补码:1111 1001 +0的补码:0000 0000 -0的补码:0000 0000
可以看出,只有在补码的情况下,+0和-0的表示是一致的;此外使用补码进行加减运算时符号位可以和数值位统一处理,无符号数和有符号数的运算也是统一的,硬件可以不用关心符号位,只是按位进行加减运算即可,运算结果是有符号还是无符号数是由语言层面来负责解释的。有兴趣的读者可以试着用补码做一些运算,来验证以上的结论。
我们再从数学的角度探讨一下补码。考虑一个8位的二进制数,它表示数的范围是0-255,超出范围的数最终也只是保留在0-255之内,因此8位二进制数可以看作是一个数的模256表示。我们再来看一下-7的补码,根据定义,它是-7的反码加1,-7的反码是将+7按位取反,也可以写作255-7,因此-7的补码就是255-7+1,即-7+256。从模256的角度来看,a和a+256是等价的,-7和-7+256也是等价的,而 -7+256正是-7的补码,所以-7和-7的补码在数学上(模256)是等价的。当1111 1001(-7的补码)表示一个有符号数时,它被解释为-7,而当它表示一个无符号数时,它就被解释为-7+256=249,有符号数和无符号数就这样被统一了起来。
综上,无论是从硬件复杂度,还是从运算逻辑的简洁性来看,使用补码来表示有符号数是非常合理的选择。有符号定点数在计算机里通常是以补码的形式存储的。
定点数除了可以表示整数外也可以用来表示小数,但是必须事先约定小数点的位置,它的整数部分和小数部分的位数是固定的。受到字长的限制,定点数能表示的数的范围是有限的,表示数的数量也是有限的,比如32位定点数,它可以表示2^32那么多小数,但是考虑到小数的范围和密度,这实在是无法满足一般的计算要求。而将整数和小数的位数固定分配,也大大降低了有限的位资源的使用效率。采用浮点数可以解决定点数带来的部分问题。
浮点数是数的另一种表现形式,顾名思义,浮点数的小数点位置并不固定。我们讨论一下基于10进制的浮点数,比如:0.12345,1.2345,12.345,123.45,它们的浮点表示方式为:
· 0.12345 = 1.2345 x 10^-1 · 1.2345 = 1.2345 x 10^0 · 12.345 = 1.2345 x 10^1 · 123.45 = 1.2345 x 10^2
这其实就是我们数学中的科学计数法,其中,1.2345是有效数(Significand),又被称为尾数(Mantissa),10是基数(Base),而-1,0,1,2则是指数或者阶码(Exponent)。由此看出这几个数的浮点数表示除了阶码不同,其他部分是一致的,阶码实际上决定了浮点数小数点的位置。
我们来看一下浮点数在计算机中的二进制表示方式,这也是在IEEE 754标准里规定的格式,以32位单精度浮点数为例:
SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
其中S代表符号位,0表示最后的结果为正数,1表示最后的结果为负数。E代表阶码,是一个有符号的整数,共8位,采用的是移码编码(后面会介绍为什么使用移码)。M代表尾数,是一个无符号的定点纯小数,共23位,小数点前面还省略了一个1,省略的二进制1可以节省宝贵的1位数,从而增加浮点数的有效位,因此尾数的形式为1.MMM…(形如1.MMM…的二进制小数被称为规格化小数)。二进制小数的基数为2,不在浮点数里表示。所以上面的浮点数最后的数值为:
+1.M x 2^E或者-1.M x 2^E
这里的阶码E是8位,如果是无符号数可以表示的范围是1到254,其中0和255具有特殊的含义。为了使E可以取负值,采用移码,它实际代表的数值需要在无符号数的基础上减去一个固定的偏移量127,所以阶码E的实际范围为-126到+127。为什么要采用移码而不是直接使用补码呢?如果采用补码,考虑浮点数全0的情形,阶码的值为0,代表2^0=1,尾数全0代表的是1.0,按照上面的公式,全0的浮点数的值为1。我们竟然没有办法来表示0这个数(如果让阶码为-128,我们可以表示很小的浮点数,但依然无法表示0),这显然无法让人接受。于是IEEE 754将阶码E的0和255做特殊处理,其它的值经过移码可以表示-126到+127,具体规定如下(设浮点数数值为N,不考虑符号位):
· 若E=0,M=0,则N=0
· 若E=0,M!=0,则N=0.M x 2^-126 (0.M为非规格化的小数,可以表示更小的小数)
· 若1<=E<=254,则N=1.M x 2^(E-127) (1.M为规格化的小数)
· 若E=255,M!=0,则N=NaN(Not a Number,代表非数值)
· 若E=255,M=0,则N=∝ (无穷大)
因此,IEEE 754标准使浮点数的0有了精确表示,同时也明确的表示了无穷大。IEEE 754标准还规定了64位双精度浮点数的格式,它包含1位符号,11位阶码和52位尾数。
浮点数的精度完全取决于尾数即有效数有多少位,而阶码则决定了小数点的位置。32位单精度浮点数的尾数为23位,它的精度可以达到10进制的6到7位;64位双精度浮点数的尾数为52位,它的精度可以达到10进制的15到16位。需要注意的是,这里的精度不代表小数点后的位数,而是指有效位数,是从第一个非0的数开始计算的。所以浮点数不仅无法精确表达一个小数,也无法精确表达一个大的整数。仅就表示整数而言,尽管浮点数可以表示比定点整数更大的范围(例如32位浮点数可以表示2^127的大数),但它损失的是精确程度。
其实,无论是32位浮点数还是32位定点整数,它们能够表达的数的个数是一样的,都是2^32个。在不增加位数的情况下,我们无法期待数的表示方法可以即扩大数的表示范围,又能提高数的精确程度。定点整数可以精确地表示整数,浮点数可以灵活近似地表示小数,这就很好了。
浮点数的算数运算比定点数要复杂得多。比如做浮点数的加减法需要5步:
· 0操作数的检查:如果有0参与运算,就不必做下面的运算了,可以节省运算时间。
· 比较阶码大小并完成对阶:指数的加减法运算要在阶码相等的情况下进行,所以要先将两个数的阶码对齐,可以通过移动尾数的小数点来完成对阶。
· 尾数进行加或减的定点运算:这里的尾数是经过对阶调整后的尾数。
· 结果规格化:尾数要表示为1.M的形式,同时也要调整阶码。
· 舍入和溢出处理:尾数要进行舍入处理,阶码要进行溢出处理。以32位浮点数为例,阶码超过+127,则浮点数向上溢出,变为正无穷大;阶码小于-126,则浮点数向下溢出,变为0。
由此可见,浮点运算效率比定点运算要低得多。在有些计算机系统里会有专门的硬件(协处理器)来做浮点运算,如果没有相应的硬件,那么就只能靠软件来进行浮点运算了。因此在资源有限的嵌入式应用里,程序员都应该避免使用大量的浮点运算。
C语言(1)- 变量和类型:
蓝彼得:C语言(1)- 变量和类型zhuanlan.zhihu.comC语言(2)- 定点数和浮点数:
蓝彼得:C语言(2)- 定点数和浮点数zhuanlan.zhihu.comC语言(3)- 运算符与表达式:
蓝彼得:C语言(3)- 运算符与表达式zhuanlan.zhihu.comC语言(4)- 控制流:跳转、条件和循环:
蓝彼得:C语言(4)- 控制流:跳转、条件和循环zhuanlan.zhihu.comC语言(5)- 内存模型与作用域:
蓝彼得:C语言(5)- 内存模型与作用域zhuanlan.zhihu.comC语言(6)- 函数调用和栈:
蓝彼得:C语言(6)- 函数调用和栈zhuanlan.zhihu.comC语言(7)- 递归:
蓝彼得:C语言(7)- 递归zhuanlan.zhihu.com -
C语言【位运算】求两个数二进制中不同位的个数
2020-11-19 00:25:00求两个数二进制中不同位的个数 问题描述: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同。 输入例子:1999 2299 输出例子:7 编程思路: 1.首先先将 m 和 n 进行按位异或(相同位上为0,不同...求两个数二进制中不同位的个数
问题描述:
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同。
输入例子:1999 2299
输出例子:7
编程思路:
1.首先先将 m 和 n 进行按位异或(相同位上为0,不同位上或),按位异或后m和n相同的二进制比特位清零,不同的二进制比特位为1;
2.统计异或完成后结果(重新定义的temp)的二进制比特位中有多少个1即可(采用按位与)。
代码如下:#include<stdio.h>
int cala_diff_bit(int m, int n)//指针变量做函数参数
{
int tmp = m ^ n;
int count = 0;
while (tmp)
{
tmp = tmp & (tmp - 1);
count++;
}
return count;
}
int main()
{
int m, n;
printf(“请输入两个数字: “);
scanf(”%d %d”, &m, &n);
int ret = calc_diff_bit(m, n);
printf(“ret=%d\n”, ret);
return 0;
}
_
结束啦,路过的记得点个赞呦! -
C语言——求两个数二进制中不同位的个数
2020-09-22 21:01:18编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 输入例子: 1999 2299 输出例子:7 /* 思路: 1. 先将 m 和 n 进行按位异或,此时m和n相同的二进制比特位清零,不同的二进制比特位为1 2. ...编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
/* 思路: 1. 先将 m 和 n 进行按位异或,此时m和n相同的二进制比特位清零,不同的二进制比特位为1 2. 统计异或完成后结果的二进制比特位中有多少个1即可 */ #include <stdio.h> int calc_diff_bit(int m, int n) { int tmp = m^n; int count = 0; while(tmp) { tmp = tmp&(tmp-1); count++; } return count; } int main() { int m,n; while(1) { scanf("%d %d", &m, &n) == 2; printf("%d\n", calc_diff_bit(m, n)); } return 0; }
-
(C语言)求两个数二进制中不同位的个数
2020-07-08 17:28:17编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 输入例子:1999 2299输出例子:7 今天我想通过操作符里的知识,通过简单的异或关系完成题面要求。 思路:将两个数异或,即可将相同位全部清0... -
C语言中利用位运算和指针实现的交换两个数的程序
2017-10-26 11:13:09位运算是C语言的一大特色,利用异或运算可以实现交换两个数,原理是一个整数与另外一个数进行两次异或运算仍然是其本身,基本原理用式子表达如下:(1) A ^ A = 0;(2) A = A ^B;(3) B = A ^B;(相当于B = A ^ B ^ B ,... -
两个int整数m和n的二进制表达中, 有多少个位不同(C语言)
2019-11-07 18:53:46两个int(32位)整数m和n的二进制表达中, 有多少个位(bit)不同? 例如:137(1000 1001)和248(1111 1000)一共有4位不同; 1999(111 1100 1111)和2299(1000 1111 1011)一共有7位不同; 思路: 对于这... -
C语言经典的位运算:求两个数二进制中不同位的个数,入门必做经典题
2020-12-14 19:43:12编程实现:求两个数二进制中不同位的个数,两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 输入例子:1999 2299 输出例子:7 解题思路 通过审题我们得知,要求两个数二进制中不同位的个数,那么就... -
(代码练习)求两个数二进制中不同位的个数---C语言
2020-12-13 21:01:09两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 思路: 将两个数进行按位异或,此时相同的二进制比特位清零,不同的二进制比特位为1;采用按位与统计异或完成后结果的二进制比特位中有多少个1。 ... -
C语言 二进制bit位操作练习(任意数二进制中1的个数、输出二进制数的奇偶位、输出一个整数的每一位、整数m...
2019-10-21 14:59:43函数返回参数二进制中 1 的个数比如: 15 0000 1111 4 个 1 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main(void) { int n = 0; int tmp = 0; while... -
C语言:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
2018-07-20 17:09:00因此我们可以通过将两个数字按位异或,并计算该异或结果中二进制位中1的个数,即可知道有多少个比特位不同。 具体代码如下: int count(int a, int b) { int m = a ^ b; // 两个数按位异或,对应不同的位将会置1... -
【C语言】两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
2019-01-08 10:47:13因此我们可以通过将两个数字按位异或,并计算该异或结果中二进制位中1的个数,即可知道有多少个比特位不同。 int count(int a, int b) { int m = a ^ b; // 两个数按位异或,对应不同的位将会置1 int num = 0; ... -
C语言中unsigned
2020-09-09 14:22:08无符号整数,计算机里的数是用二进制表示的,最左边的这一位用来表示这zhi个数是正数还是负数,这样的话这个数就是有符号整数。 如果最左边这一位不用来表示正负,而是和后面的连在一起表示整数,那么就不能区分这... -
获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列3. 两个int(32位)整数m和n的二进制...
2019-05-24 15:00:19写一个函数返回参数二进制中 1 的个数 比如: 15 0000 1111 中有4 个 1 #include<stdio.h> #include<windows.h> int count_one_bits(unsigned int value) { int count = 0; while (value) {... -
c语言编程实现两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
2018-03-30 19:51:42这个问题可以先把两个数按位异或,找出两个数不同的位,把异或后的值再赋给一个数,再数这个数里一的个数,即为不相同的个数。# include <stdio.h># include <stdlib.h>int count_one_... -
C语言——编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
2019-02-14 14:28:18两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 输入例子: 1999 2299 输出例子:7 【解题思路】:直接分别把两个数的32位二进制序列依次拿出来相比较(用和1相与移位再循环的方法),不一样时计数器... -
字符斜杠是合法常量吗_C语言常量表达
2021-01-07 13:08:45‘A’代表的是一个数字65,因为在ASCII编码表中A的数值是65,依此类推:‘ B’代表66,‘a’代表97,‘X’代表88,‘5’代表53,‘=’代表61,‘|’代表124,’ ’空格代表32等等。因此,字符常量实际上也是一种整数... -
C语言中八进制和16进制怎么表示,原码,反码及补码,C语言按位取反运算符~
2012-10-07 13:01:39C语言中8进制和16进制怎么表示 C语言本身支持的三种输入是: 1. 十进制。比如20,457; 2. 十六进制,以0x开头。比如0x7a; 3. 八进制,以0开头。比如05,0237 所以C语言没有二进制输入,最多可用函数去实现。 ... -
C语言学习笔记----6.C语言中的正负数及输出
2020-07-27 16:49:59在C语言中也是如此,但是鉴于数字在计算机中的存储方式,就需要一个bit位来存储符号位,如: //正数 short a1 = -10; short a2 = -0x2dc9; //十六进制前缀0x //负数 int b1 = 10; int b2 = +0174; //八进制前缀0 以... -
C语言中常见的判断题.docx
2020-10-15 22:33:12判断题 TOC \o "1-5" \h \z 1在C语言中各种类型的整型数据在内存中都占 2个字节 F 2表达式j=3, j++的值是4. F 3格式字符%e以指数形式输出实数数字部分小数位数 7位. F char c[6]="abcde; printf%3s, c表示输出的字段... -
C语言100题之第一题及变式:四个数字分别为1,2,3,4,能组成多少个互不相同且无重复数字的三位数,它们...
2021-01-02 09:50:53C语言100题之第一题:四个数字分别为1,2,3,4,能组成多少个互不相同且无重复数字的三位数,它们分别是什么? 分析 :三位数字中的每一位均可以是1,2,3,4;通过三层循环将三位数字表达出来,再去掉重复的数字... -
c语言中常见的判断题.doc
2020-01-12 01:08:54判断题 1 在C语言中各种类型的整型数据在内存中都占2个字节 F 2 表达式 (j=3, j++) 的值是4. F 3 格式字符%e以指数形式输出实数数字部分小数位数7位. F 4 char c[6]="abcde; printf%3s, c)表示输出的字段的宽度为3位... -
c语言练习题(二进制中 1 的个数、输出二进制奇数位偶数位序列、输出整数每一位、两个int整数二进制表达中...
2019-05-22 10:54:121、写一个函数返回参数二进制中 1 的个数。比如: 15:0000 1111 (4 个 1)。 程序原型: int count_one_bits(unsigned int value) { // 返回 1的位数 } int count_one_bits(unsigned int value) { int i =... -
C语言:二进制表达的一些习题练习
2018-04-04 19:23:58写一个函数返回参数二进制中 1 的...获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。 输出一个整数的每一位。 编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?... -
C语言 八进制 16进制 原码 反码 补码 按位取反
2013-11-06 10:15:28C语言中8进制和16进制怎么表示 C语言本身支持的三种输入是: 1. 十进制。比如20,457; 2. 十六进制,以0x开头。比如0x7a; 3. 八进制,以0开头。比如05,0237 所以C语言没有二进制输入,最多可用函数... -
C语言——
2018-10-28 12:16:14问题一: 内存如何寻址? 内存中的每个字节都有唯一的编号,我们把这种编号称之为地址...在表达和交流时,通常把地址写成十六进制数。 问题三:如何对变量寻址? #include&amp;lt;stdio.h&amp;g... -
C语言把二进制转换为十进制数的方法和示例
2020-04-19 12:46:13在实际开发中,我们可能会用0和1的字符串来表达信息,例如某设备有八个传感器,每个传感器的状态用1表示正常,用0表示故障,用一个二进制的字符串表示它们如01111011,也可以用一个字符或整数表示它即123。... -
[c语言]——二进制中 1 的个数
2018-10-28 15:17:34写一个函数返回参数二进制...2.获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。 输出一个整数的每一位。 4.编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?...
-
NFS 实现高可用(DRBD + heartbeat)
-
HTTP会话保持技术Cookie与Session
-
sql server 2000 评估版过期的几种完美解决办法
-
MySQL你该了解的那些事【服务端篇】
-
群体遗传学习笔记-测序技术学习
-
里恩药物警戒系统(RH-PV)介绍
-
我的世界贝爷生存R149整合包20170501.rar
-
Jsplumb从入门到实战
-
找http代理的小技巧大全
-
龙芯生态应用开发基础:C语言精要
-
地方政府两会专题网页模板 div+css psd源文件
-
FastDFS 分布式文件系统部署
-
MATLAB 太阳系运动仿真
-
MobileTouchCamera 1.9.unitypackage.zip
-
Java定时任务
-
互联网应用:不以抄袭为耻,但以抄袭为常
-
SAP License:SAP概念辨识
-
朱老师C++课程第3部分-3.6智能指针与STL查漏补缺
-
gcc使用方法
-
【python】matplotlib绘图