操作系统位数原理中页面大小为2的3次幂求二进制位数

十进制中10换成二进制是多少
十进制中10换成二进制是多少 20
不区分大小写匿名
1换成1
2换成10
3
11
4 100
5 101
6
1001
10 1010
1 0 1 0
a b c d
对照上面的表格
其中d代表2的0次幂
c代表2的1次幂
b达标2的2次幂
a代表2的3次幂
该位为1则说明该位存在,为0则不存在.
算法如下1010 = 0*1 + 1*2 + 0*2*2 + 1*2*2*2 = 10
反过来算
1) 10/2 = 5 余数为0 所以d位=0
2) 5/2 = 2 余数为1 所以c位=1
3) 2/2 = 1 余数为0 所以b位=0
4) 1/2 = 0 余数为1 所以a位=1
5) 除数为0 结束变换,最后的结果为abcd = 1010
在开始-程序-附件里有计算机
在计算机查看里改成科学性,点击十进制输入10然后点击二进制就可以换算
十进制的10换算成二进制是1010
简单点说,二进制就是逢二进一
1~1
2~10
3~11
4~100
5~101
6~110
7~111
8~1000
9~1001
10~1010
以此类推
1010
教你个方法,十进制转二进制的方法,用十进制的数除以2,整除记为0,有余数记为1,都除完后得到的一串数字,倒一下就是答案了
可能说的比较抽象
这不能发图片太可惜了
十进制数除以2取余数,例如13除以2得6余1,6除以2得3余0,3除以2得1余1,1除以2得0余1,余数倒着来就是二进制数,即1101。
那么10就是:10除以2等于5余0,用再5除以2等于2余1,2除以2等于1余0,最后1除以2余0。
再将所有余数倒着排列即1010咯。
还有一个摘抄来的,方法也不错,你看一看:整数是除2取余,小数是乘2取整
69 这里给你介绍一个简便的方法
2^1=2,2^2=4,2^3=8,2^4=16,2^5=32,2^6=64
69可以拆为
所以69的2进制为 1000101
十进制小数转换为二进制小数
十进制小数转换成二进制小数采用&乘2取整,顺序排列&法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。
【例1】把(0.8125)转换为二进制小数。
【例2】 (173.8125)10=( )2
解: 由〔例1107〕得(173)10=(
由〔例1〕得(0.8125)10=(0.1101)2
把整数部分和小数部分合并得: (173.8125)10=(1)2
帅哥,把分给我把!谢谢咯。
二进制数有两个特点:它由两个基本字符0,1组成,二进制数运算规律是逢二进一。
为区别于其它进制数,二进制数的书写通常在数的右下方注上基数2,或加后面加B表示。
例如:二进制数可以写成(,或写成B,对于十进制数可以不加注.计算机中的数据均采用二进制数表示,这是因为二进制数具有以下特点:
1) 二进制数中只有两个字符0和1,表示具有两个不同稳定状态的元器件。例如,电路中有,无电流,有电流用1表示,无电流用0表示。类似的还比如电路中电压的高,低,晶体管的导通和截止等。
2) 二进制数运算简单,大大简化了计算中运算部件的结构。
二进制数的加法和乘法运算如下:
0+0=0 0+1=1+0=1 1+1=10
0×0=0 0×1=1×0=0 1×1=1
由于二进制数在使用中位数太长,不容易记忆,所以又提出了十六进制数.
⑴二进制数转换成十进制数
[例]()2=1×210+1×29+1×28+1×27+1×26+0×25+0×24
+1×23+0×22+0×21+1×20
(=1×23+0×22+1×21+1×20+1×2-1+0×2-2+1×2-3 =(11.625)10
⑵十进制数转换成二进制数
①十进制整数转换成二进制整数(除基(2)取余法)
2 996 …………1…………0位 低位二进制整数
2 498 …………0…………1位
2 249 …………0…………2位
2 124 …………1…………3位
2 62 …………0…………4位
2 31 …………0…………5位
2 15 …………1…………6位
2 7 …………1…………7位
2 3 …………1…………8位
2 1 …………1…………9位
0 …………1…………10位 高位二进制整数
注意,除到0商时结束2除步,回写(从高位回到低位)余数便是所求二进制数,即:(
②十进制纯小数转换成二进制纯小数(乘基(2)取整法)
2-1位… 1. 250 高位二进制小数
2-2位… 0. 500
2-3位 1.000 低位二进制小数
纯小数位被全乘为0时,得准确二进制纯小数;否则(纯小数位永远被2乘不为全是0)只能化成满足某一精确度要求的二进制小数的近似值。例中(0.625)10=(0.101)2是准确值,其中101是顺写的积整位(从高位到低位)数。
要想学会,注重在多练,多算,欲速则不达。多练练就熟能生巧了
就是把那个十进制数不断地除以2每次的余数写出来(余数只有0和1两种情况),最后把所有余数倒着写出来就是那个二进制数了!
10/2 = 5 余数为0 所以d位=0
5/2 = 2 余数为1 所以c位=1
2/2 = 1 余数为0 所以b位=0
1/2 = 0 余数为1 所以a位=1
最后的结果为abcd = 1010
这样算的。
1010可以吗
我老是算不对求答案
等待您来回答
电脑常识领域专家扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
2010年自考工学类操作系统原理复习资料
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口酷勤网 C 程序员的那点事!
当前位置: >
浏览次数:次
由电子工业出版社博文视点和w3china.org社区联合举办了&看样章,&写书评,&赢取《》的&,详情请见:
大家踊跃参加,活动非常热烈。下面文章来自读者ZelluX:
求二进制中1的个数。对于一个字节(8bit)的变量,求其二进制表示中&1&的个数,要求算法的执行效率尽可能的高。
先来看看样章上给出的几个算法:
解法一,每次除二,看是否为奇数,是的话就累计加一,最后这个结果就是二进制表示中1的个数。
解法二,同样用到一个循环,只是里面的操作用位移操作简化了。
&&&1:&&int&Count(int&v)&&&&&&2:&&{&&&&&&3:&&&&&&int&num&=&0;&&&4:&&&&&&while&(v)&{&&&&&&5:&&&&&&&&&&num&+=&v&&&0x01;&&&&&&6:&&&&&&&&&&v&&&=&1;&&&&&&7:&&&&&&}&&&&&&8:&&&&&&return&&&&&&&9:&&}&
解法三,用到一个巧妙的与操作,v&&&(v&-1&)每次能消去二进制表示中最后一位1,利用这个技巧可以减少一定的循环次数。
解法四,查表法,因为只有数据8bit,直接建一张表,包含各个数中1的个数,然后查表就行。复杂度O(1)。
&&&1:&&int&countTable[256]&=&{&0,&1,&1,&2,&1,&...,&7,&7,&8&};&&&&&&2:&&&&&&&&&3:&&int&Count(int&v)&{&&&&&&4:&&&&&&return&countTable[v];&&&&&&5:&&}&&&好了,这就是样章上给出的四种方案,下面谈谈我的看法。
首先是对算法的衡量上,复杂度真的是唯一的标准吗?尤其对于这种数据规模给定,而且很小的情况下,复杂度其实是个比较次要的因素。
查表法的复杂度为O(1),我用解法一,循环八次固定,复杂度也是O(1)。至于数据规模变大,变成32位整型,那查表法自然也不合适了。
其次,我觉得既然是这样一个很小的操作,衡量的尺度也必然要小,CPU时钟周期可以作为一个参考。
解法一里有若干次整数加法,若干次整数除法(一般的编译器都能把它优化成位移),还有几个循环分支判断,几个奇偶性判断(这个比较耗时间,根据CSAPP上的数据,一般一个branch&penalty得耗掉14个左右的cycle),加起来大概几十个cycle吧。
再看解法四,查表法看似一次地址计算就能解决,但实际上这里用到一个访存操作,而且第一次访存的时候很有可能那个数组不在cache里,这样一个cache&miss导致的后果可能就是耗去几十甚至上百个cycle(因为要访问内存)。所以对于这种&小操作&,这个算法的性能其实是很差的。
这里我再推荐几个解决这个问题的算法,以32位无符号整型为例。
&&&1:&&int&Count(unsigned&x)&{&&&&&&2:&&&&&x&=&x&-&((x&&&&1)&&&0x);&&&&&&&3:&&&&&x&=&(x&&&0x)&+&((x&&&&2)&&&0x);&&&&&&&4:&&&&&x&=&(x&+&(x&&&&4))&&&0x0F0F0F0F;&&&&&&&5:&&&&&x&=&x&+&(x&&&&8);&&&&&&&6:&&&&&x&=&x&+&(x&&&&16);&&&&&&&7:&&&&&return&x&&&0x0000003F;&&&&&&&8:&&}&&&&这里用的是二分法,两两一组相加,之后四个四个一组相加,接着八个八个,最后就得到各位之和了。
还有一个更巧妙的HAKMEM算法
&&&1:&&int&Count(unsigned&x)&{&&&2:&&&&&unsigned&n;&&&&&&&3:&&&&&&&&&4:&&&&&n&=&(x&&&&1)&&&;&&&&&&&5:&&&&&x&=&x&-&n;&&&&&&6:&&&&&n&=&(n&&&&1)&&&;&&&&&&7:&&&&&x&=&x&-&n;&&&&&&&8:&&&&&x&=&(x&+&(x&&&&3))&&&;&&&&&&9:&&&&&x&=&modu(x,&63);&&&&&10:&&&&&return&x;&&&&&&11:&&}&&&&首先是将二进制各位三个一组,求出每组中1的个数,然后相邻两组归并,得到六个一组的1的个数,最后很巧妙的用除63取余得到了结果。
因为2^6&=&64,也就是说&x_0&+&x_1&*&64&+&x_2&*&64&*&64&=&x_0&+&x_1&+&x_2&(mod&63),这里的等号表示同余。
这个程序只需要十条左右指令,而且不访存,速度很快。
由此可见,衡量一个算法实际效果不单要看复杂度,还要结合其他情况具体分析。
关于后面的两道扩展问题,问题一是问32位整型如何处理,这个上面已经讲了。
问题二是给定两个整数A和B,问A和B有多少位是不同的。
这个问题其实就是数1问题多了一个步骤,只要先算出A和B的异或结果,然后求这个值中1的个数就行了。
总体看来这本书还是很不错的,比较喜欢里面针对一个问题提出不同算法并不断改进的风格。这里提出一点个人的理解,望大家指正&;-)
& 相关主题:求二进制数中1的个数
求二进制数中1的个数
对于一个字节(8bit)的变量,求其二进制表示中“1 ” 的个数,要求算法的执行效率尽可能地高
写出算法即可
用移位,一位一位的取出判断,这个方法应该是比较简单的。
还有就是可以按照十进制转二进制的算法来计算。
还有一种是把他格式化成字符串,用%b的形式,这样二进制数就变成字符串了,可以一个一个的判断。
其他回答 (3)
sum+=原数除以2的余数(得到一个商)
循环
&&&& sum+=商除以2的余数(得到新的商)
最后sum就是1的个数
for(i=0;a;)
{
&if(a%2)
& i++;
&a/=2;
}
#include"stdio.h"void main(){unsigned char a,j=0x80;//a为要测试的数int sum=0,i=0;//sum是1的个数&scanf("%d",&a);&for(i=0;i&8;i++)&{&if((a&j)!=0)sum++;& & j&&=1;&}&printf("%d\n",sum);}
&
等待您来回答
编程领域专家

我要回帖

更多关于 操作系统位数 的文章

 

随机推荐