微信小程序>新闻>资讯>「C语言学习:C语言位运算」百家号Lite
「C语言学习:C语言位运算」百家号Lite-微信小程序

「C语言学习:C语言位运算」百家号Lite

79

分类:新闻资讯

开发作者: 「C语言学习:C语言位运算」百家号Lite

发布时间: 2019-04-02 10:57:24

更新时间: 2019-04-02 10:57:24

查看要求: 微信app最新版本

更多信息: 关于「C语言学习:C语言位运算」百家号Lite

「C语言学习:C语言位运算」百家号Lite-微信小程序二维码

微信扫码体验

「C语言学习:C语言位运算」百家号Lite小程序介绍

「C语言学习:C语言位运算」百家号Lite_作者自评:

如何评价百家号Lite小程序热议话题「C语言学习:C语言位运算」
正文共:6580字预计阅读时间10分钟
引言
在前面的C语言学习中,我们的各种运算都是以字节为基本单位进行的,但在编写很多系统程序中,如调制解调程序、磁盘文件管理程序和打印机驱动程序等,常要求在位(bit)一级进行运算或处理。C语言提供了位运算功能,使得C语言也能像火遍语言一样用来编写系统程序。位运算应用于整型数据,即把整型数据看做固定的二进制序列,然后对这些二进制序列进行按位运算。与其他高级语言相比,位运算是C语言的特点之一。
什么是位运算
所谓位运算,就是对一个比特(Bit)位进行操作。比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了。C语言提供了六种位运算符如下表:一、按位与运算(&)
一个比特(Bit)位只有0和1两个取值,只有参与&运算的两个位都为1时,结果才为1,否则为0。例如1&1为1,0&0为0,1&0也为0,这和逻辑运算符&&非常类似。C语言中不能直接使用二进制,&两边的操作数可以是十进制、八进制、十六进制,它们在内存中最终都是以二进制形式存储,&就是对这些内存中的二进制位进行运算。其他的位运算符也是相同的道理。例如,9&5可以转换成如下的运算:
00000000000000000000000000001001 (9在内存中的存储)&00000000000000000000000000000101 (5在内存中的存储)00000000000000000000000000000001 (1在内存中的存储)
也就是说,按位与运算会对参与运算的两个数的所有二进制位进行&运算,9&5的结果为1。又如,9&5可以转换成如下的运算:
11111111111111111111111111110111 (9在内存中的存储)&00000000000000000000000000000101 (5在内存中的存储)00000000000000000000000000000101 (5在内存中的存储)
9&5的结果是5。
再强调一遍,&是根据内存中的二进制位进行运算的,而不是数据的二进制形式;其他位运算符也一样。以9&5为例,9的在内存中的存储和9的二进制形式截然不同:
11111111111111111111111111110111 (9在内存中的存储)00000000000000000000000000001001 (9的二进制形式,前面多余的0可以抹掉)
按位与运算通常用来对某些位清0,或者保留某些位。例如要把n的高16位清0,保留低16位,可以进行n&0XFFFF运算(0XFFFF在内存中的存储形式为00000000000000001111111111111111)。【实例】对上面的分析进行检验。
include<stdio.h>intmain(){intn=0X8FA6002D;printf(%d,%d,%X\n,9&5,9&5,n&0XFFFF);return0;}运行结果:1,5,2D
二、按位或运算(|)
参与|运算的两个二进制位有一个为1时,结果就为1,两个都为0时结果才为0。例如1|1为1,0|0为0,1|0为1,这和逻辑运算中的||非常类似。例如,9|5可以转换成如下的运算:
00000000000000000000000000001001 (9在内存中的存储)|  00000000000000000000000000000101 (5在内存中的存储)00000000000000000000000000001101 (13在内存中的存储)
9|5的结果为13。又如,9|5可以转换成如下的运算:
11111111111111111111111111110111 (9在内存中的存储)|  00000000000000000000000000000101 (5在内存中的存储)11111111111111111111111111110111 (9在内存中的存储)
9|5的结果是9。按位或运算可以用来将某些位置1,或者保留某些位。例如要把n的高16位置1,保留低16位,可以进行n|0XFFFF0000运算(0XFFFF0000在内存中的存储形式为11111111111111110000000000000000)。【实例】对上面的分析进行校验。
include<stdio.h>intmain(){intn=0X2D;printf(%d,%d,%X\n,9|5,9|5,n|0XFFFF0000);return0;}运行结果:13,9,FFFF002D
三、按位异或运算(^)
参与^运算两个二进制位不同时,结果为1,相同时结果为0。例如0^1为1,0^0为0,1^1为0。例如,9^5可以转换成如下的运算:
00000000000000000000000000001001 (9在内存中的存储)^ 00000000000000000000000000000101 (5在内存中的存储)00000000000000000000000000001100 (12在内存中的存储)
9^5的结果为12。又如,9^5可以转换成如下的运算:
11111111111111111111111111110111 (9在内存中的存储)^ 00000000000000000000000000000101 (5在内存中的存储)11111111111111111111111111110010 (14在内存中的存储)
9^5的结果是14。按位异或运算可以用来将某些二进制位反转。例如要把n的高16位反转,保留低16位,可以进行n^0XFFFF0000运算(0XFFFF0000在内存中的存储形式为11111111111111110000000000000000)。【实例】对上面的分析进行校验。
include<stdio.h>intmain(){unsignedn=0X0A07002D;printf(%d,%d,%X\n,9^5,9^5,n^0XFFFF0000);return0;}运行结果:12,14,F5F8002D
四、取反运算(~)
取反运算符~为单目运算符,右结合性,作用是对参与运算的二进制位取反。例如~1为0,~0为1,这和逻辑运算中的!非常类似。。例如,~9可以转换为如下的运算:
~00000000000000000000000000001001 (9在内存中的存储)11111111111111111111111111110110 (10在内存中的存储)
所以~9的结果为10。例如,~9可以转换为如下的运算:
~11111111111111111111111111110111 (9在内存中的存储)00000000000000000000000000001000 (9在内存中的存储)
所以~9的结果为8。【实例】对上面的分析进行校验。
include<stdio.h>intmain(){printf(%d,%d\n,~9,~9);return0;}运行结果:10,8
五、左移运算(<<)
左移运算符<<用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补0。例如,9<<3可以转换为如下的运算:
<<00000000000000000000000000001001 (9在内存中的存储)00000000000000000000000001001000 (72在内存中的存储)
所以9<<3的结果为72。又如,(9)<<3可以转换为如下的运算:
<<11111111111111111111111111110111 (9在内存中的存储)11111111111111111111111110111000 (72在内存中的存储)
所以(9)<<3的结果为72如果数据较小,被丢弃的高位不包含1,那么左移n位相当于乘以2的n次方。【实例】对上面的结果进行校验。
includeintmain(){printf(%d,%d\n,9<<3,(9)<<3);return0;}运行结果:72,72
六、右移运算(>>)
右移运算符>>用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补0或1。如果数据的最高位是0,那么就补0;如果最高位是1,那么就补1。例如,9>>3可以转换为如下的运算:
>>00000000000000000000000000001001 (9在内存中的存储)00000000000000000000000000000001 (1在内存中的存储)
所以9>>3的结果为1。又如,(9)>>3可以转换为如下的运算:
>>11111111111111111111111111110111 (9在内存中的存储)11111111111111111111111111111110 (2在内存中的存储)
所以(9)>>3的结果为2如果被丢弃的低位不包含1,那么右移n位相当于除以2的n次方(但被移除的位中经常会包含1)。【实例】对上面的结果进行校验。
include<stdio.h>intmain(){printf(%d,%d\n,9>>3,(9)>>3);return0;}运行结果:1,2
补充二进制思想以及数据的存储
我们平时使用的数字都是由0~9共十个数字组成的,例如1、9、10、297、952等,一个数字最多能表示九,如果要表示十、十一、二十九、一百等,就需要多个数字组合起来。例如表示5+8的结果,一个数字不够,只能”进位“,用13来表示;这时”进一位“相当于十,”进两位“相当于二十。因为逢十进一,也因为只有0~9共十个数字,所以叫做十进(Decimalism)。进制也就是进位制。在进行加法(减法)运算时,逢X进(借)一就是X进制,这种进制也就包含X个数字,基数为X。十进制有0~9共10个数字,基数为10,在加减法运算中,逢十进一,借一当十。我们不妨将思维拓展一下,既然可以用0~9共十个数字来表示数值,那么也可以用0、1两个数字来表示数值,这就是二进制(Binary)。
二进制思想
二进制只有0和1两个数字,基数为2,在加减法运算中,逢二进一,借一当二。
表示数值:0、1、10、111、100、1000001加法:1+0=1、1+1=10、10+110=1000、111+111=1110减法:10=1、101=1、10011=1、1010101=101二进制和十进制的转换:十进制4321=4×103+3×102+2×101+1×100二进制1101=1×23+1×22+0×21+1×20=8+4+0+1=13二进制110.11=1×22+1×21+0×20+1×21+1×22=4+2+0+0.5+0.25=6.75在内存中,数据就是以二进制的形式存储的。内存中数据的存储
计算机要处理的信息是多种多样的,如十进制数、文字、符号、图形、音频、视频等,这些信息在人们的眼里是不同的。但对于计算机来说,它们在内存中都是一样的,都是以二进制的形式来表示。要想学习编程,就必须了解二进制,它是计算机处理数据的基础。内存条是一个非常精密的部件,包含了上亿个电子元器件,它们很小,达到了纳米级别。这些元器件,实际上就是电路;电路的电压会变化,要么是0V,要么是5V,只有这两种电压。5V是通电,用1来表示,0V是断电,用0来表示。所以,一个元器件有2种状态,0或者1。我们通过电路来控制这些元器件的通断电,会得到很多0、1的组合。例如,8个元器件有28=256种不同的组合,16个元器件有216=65536种不同的组合。虽然一个元器件只能表示2个数值,但是多个结合起来就可以表示很多数值了。一般情况下我们不一个一个的使用元器件,而是将8个元器件看做一个单位,即使表示很小的数,例如1,也需要8个,也就是00000001。1个元器件称为1比特(Bit)或1位,8个元器件称为1字节(Byte),那么16个元器件就是2Byte,32个就是4Byte,以此类推:
8×1024个元器件就是1024Byte,简写为1KB;8×1024×1024个元器件就是1024KB,简写为1MB;8×1024×1024×1024个元器件就是1024MB,简写为1GB。现在,你知道1GB的内存有多少个元器件了吧。我们通常所说的文件大小是多少KB、多少MB,就是这个意思。
单位换算:
8Bit=1Byte1024Byte=1KB1024KB=1MB1024MB=1GB1024GB=1TB你看,在内存中没有abc这样的字符,也没有gif、jpg这样的图片,只有0和1两个数字,计算机也只认识0和1。所以,计算机使用二进制,而不是我们熟悉的十进制,写入内存中的数据,都会被转换成0和1的组合。
关注我们:源世界关注百家号每天收听我们的消息,源世界为您奉上精品文章。欢迎订阅点赞,谢谢!
该话题由百家号作者日常生活Blog「简介:关注互联网发展和编程学习」
更多有关C语言学习:C语言位运算的话题讨论请访问百家号Litex小程序关注作者-日常生活Blog

「C语言学习:C语言位运算」百家号Lite_使用指南:

步骤1:微信扫描「C语言学习:C语言位运算」百家号Lite小程序码即可使用;

步骤2:微信搜索「C语言学习:C语言位运算」百家号Lite小程序名称即可使用;

步骤3:微信网页访问即速商店-长按识别「C语言学习:C语言位运算」百家号Lite小程序码即可使用。

「C语言学习:C语言位运算」百家号Lite_服务声明:

本服务由「C语言学习:C语言位运算」百家号Lite小程序开发者向微信用户提供,并对本服务信息内容、数据资料及其运营行为等的真实性、合法性及有效性承担全部责任。

"「C语言学习:C语言位运算」百家号Lite"由开发者"「C语言学习:C语言位运算」百家号Lite"原创首发于微信小程序商店shop.jisuapp.cn,转载请注明出处。

「C语言学习:C语言位运算」百家号Lite小程序截图

「C语言学习:C语言位运算」百家号Lite小程序评分

4.6

共收到5条评价

5星3条

4星2条

3星0条

2星0条

1星0条

「C语言学习:C语言位运算」百家号Lite小程序评论

请给小程序评分

  • 风云之王2020-01-28 02:12:38

    这个「C语言学习:C语言位运算」百家号Lite小程序的页面我很喜欢,赞!

  • ╃ノ╲, 男 ╯2020-01-28 02:11:59

    这个「C语言学习:C语言位运算」百家号Lite小程序的功能能满足我使用它的基本诉求,可以可以

  • 眼花耳热后2020-01-28 02:08:38

    这「C语言学习:C语言位运算」百家号Lite小程序长得好看,功能又多,还不占内存,很好很强势

  • 致命的癫疯▌2020-01-28 02:08:34

    自打用了这个「C语言学习:C语言位运算」百家号Lite小程序吧,手机里的同类APP就被我卸载了~

  • 丶巛全F最嗨o灬2020-01-28 02:02:33

    这么好用的「C语言学习:C语言位运算」百家号Lite小程序当然要分享给好朋友啦!

提交小程序关注微信

海量浏览,人人体验

提交申请

入驻催审,首页推荐