如何滴水不漏的学完C语言?C语言程序中,使用移位操作代替乘除运算,真的效率更高吗

2024-06-04 21:14:18 14

如何滴水不漏的学完C语言?C语言程序中,使用移位操作代替乘除运算,真的效率更高吗

本文目录

如何滴水不漏的学完C语言

C语言本身基础语法并不复杂,问题是拓展库太多,而且很多库是针对特定应用功能的。比如:有数学运算的、有图像处理的、有视频处理的,有AI运算的,有语言处理的,有图像识别等等等等。还有用于特定设备驱动程序。正所谓包罗万象,学无止境。根本原因就是c一个除汇编外最基础最底层的语言。

C语言程序中,使用移位操作代替乘除运算,真的效率更高吗

先简单小结一下:

  • 当编译器优化能力很弱时,用移位代替简单除法(除2,4,8,16...)效率更高;

  • 当编译器优化能力很弱时,在低端CPU上,用移位代替简单乘法(乘2,4,8,16...)效率更高

  • 其它情况下,在C语言程序中,用移位操作代替乘除运算没什么效果,反而降低了代码的可读性

下面简单说一下各种情况:

编译器因素

现代C编译器对于简单的2,4,8之类的乘除法,会在优化时根据条件自动转换成移位运算。这时,没有必要手动使用移位操作符代替乘除,相信编译器的优化能力就好了。有时候为了更好的适配目标CPU,可以给编译器提供详细参数,如ARM C编译器可指定乘法指令所需周期数,这就方便编译器针对特定CPU进行优化。

除法

当编译器不能进行自动移位优化时,对于简单除法,使用移位操作代替会有一定效果:由于除法的算法特性,RISC CPU(如ARM系列绝大多数CPU)都没有完整的整数除法指令,这是基于除法特殊性造成的。如果用浮点数除法模拟,则结果未必正确,同时起码需要十几个时钟周期才能完成。这时,如果能用两三次移位操作和加法组合完成除法,当然会有效率的提高。

再说说CPU的影响:

低端CPU

这里提到的低端CPU,指的是没有硬件乘法器、也没有浮点协处理器的CPU。这类CPU的乘法需要用加法模拟,因此速度较慢。此时,用移位操作代替简单的乘法能提高效率。

低端CPU举例:无MAC单元的ARM Cortex-M系列CPU,AVR的Atmega等各8位MCU。

中高端CPU

中高端CPU通常都有乘法器和浮点协处理器。对于这类CPU,用移位代替乘法意义不大,也许能在CPU指令发射时降低流水线阻塞(这是由于多发射高端CPU的移位处理单元数量多于乘法器数量),从而提高微量的性能,但总体影响微乎其微。

C语言中位移位运算符

  • 位移位运算符,顾名思议,用来移位用。
    如:
    a=0x01;
    a 《《=2;
    则,a变成0x04了。
    上面是左移,如果右移是a 》》= 2;

  • 在c语言中位移运算符,有两种,分别是“《《“左移和“》》“右移

C语言左位移运算符和右位移运算符是什么意思,怎么运算,举个例子..

就是把一个数转化成二进制再直接对他进行操作
例如:
45》》2 //45右移两位
45的二进制为:101101
右移两位就为: 001011
001011再转化为十进制为:11
所以45》》2= 11
左移运算符
45《《2
45的二进制为:101101
左移两位就为:10110100
10110100再转化为十进制为:180
所以45《《2=180

c语言中位运算的左位移右位移都是什么意思

假设0010
左移就是把二进制数向左移动,右边补0,0的二进制全是0,左移之后右边再补0。
0010《《2 就是1000 实际是做的*4。
1000》》2 计算 0010 实际做的是/4。

位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。
位移位运算符的运算对象、运算规则与结果、结合性如表2-16所示。
移位时,移出的位数全部丢弃,移出的空位补入的数与左移还是右移花接木有关。如果是左移,则规定补入的数全部是0;如果是右移,还与被移位的数据是否带符号有关。若是不带符号数,则补入的数全部为0;若是带符号数,则补入的数全部等于原数的最左端位上的原数(即原符号位)。具体移位规则如下所示。
位移位运算符的优先级如下:
·算术运算符 优先于 位移位运算符 优先于 关系运算符
·位移位运算符是同级别的,结合性是自左向右
例如,设无符号短整型变量a为0111(对应二进制数为0000000001001001),
则:a《《3 结果为01110(对应二进制数为0000001001001000),a不变
a》》4 结果为04 (对应二进制数为0000000000000100),a不变
又如,设短整型变量a为-4(对应二进制数为1111111111111100),
则:a《《3 结果为-32(对应二进制数为1111111111100000),a不变
a》》4 结果为-1(对应二进制数为1111111111111111),a不变

c语言中有哪些运算符,各有什么功能

加法运算符 

1、移位运算符 

2、 关系运算符 

3、相等运算符 

4、 位与运算符 

5、位异或运算符 

6、 位或运算符 

7、 逻辑与运算符 

8、 逻辑或运算符 

9、 三元条件运算符 

10、 赋值运算符 

12、逗号运算符 

13、优先级

功能介绍:

1、赋值语句的作用是把某个常量或变量或表达式的值赋值给另一个变量。符号为‘=’。这里并不是等于的意思,只是赋值,等于用‘==’表示;

2、算术运算符在C语言中有两个单目和五个双目运算符;

3、逻辑运算符是根据表达式的值来返回真值或是假值。其实在C语言中没有所谓的真值和假值,只是认为非0为真值,0为假值;

4、关系运算符是对两个表达式进行比较,返回一个真/假值;

5、自增自减运算符,这是一类特殊的运算符,自增运算符++和自减运算符--对变量的操作结果是增加1和减少1;

6、赋值运算符,还有一类C/C++独有的复合赋值运算符。它们实际上是一种缩写形式,使得对变量的改变更为简洁;

7、条件运算符(?:)是C语言中唯一的一个三目运算符,它是对第一个表达式作真/假检测,然后根据结果返回两外两个表达式中的一个;

8、逗号运算符在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值;

9、优先级和结合性,这些运算符计算时都有一定的顺序,就好象先要算乘除后算加减一样。优先级和结合性是运算符两个重要的特性,结合性又称为计算顺序,它决定组成表达式的各个部分是否参与计算以及什么时候计算。

C语言移位运算符怎么用

右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:10100110
》》5(假设字长为8位),则得到的是
11111101。
总之,在c中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.
所以,short
a=0xf245,即a=1111001001000101,经过右移后,b=a》》8;b=1111111111110010,即b=0xfff2。注意是有符号右移为算术右移!!!

C语言中移位运算

1、“按位与”运算符(&)

按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其实与逻辑上“与”的运算规则一致。逻辑上的“与”,要求运算数全真,结果才为真。若,A=true,B=true,则A∩B=true 例如:3&5 3的二进制编码是11(2)。(为了区分十进制和其他进制,本文规定,凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据的基本单位是字节(Byte),一个字节由8个位(bit)所组成。位是用以描述电脑数据量的最小单位。二进制系统中,每个0或1就是一个位。将11(2)补足成一个字节,则是00000011(2)。5的二进制编码是101(2),将其补足成一个字节,则是00000101(2)

按位与运算:
00000011(2)

&00000101(2)

00000001(2)

由此可知3&5=1

c语言代码:

#include 《stdio.h》

main()
{
int a=3;
int b = 5;
printf(“%d“,a&b);
}

按位与的用途:

(1)清零

若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。例:原数为43,即00101011(2),另找一个数,设它为148,即10010100(2),将两者按位与运算:

00101011(2)

&10010100(2)

00000000(2)

c语言源代码:

#include 《stdio.h》
main()
{
int a=43;
int b = 148;
printf(“%d“,a&b);
}

(2)取一个数中某些指定位:若有一个整数a(2byte),想要取其中的低字节,只需要将a与8个1按位与即可。

a 00101100 10101100

b 00000000 11111111

c 00000000 10101100

(3)保留指定位:与一个数进行“按位与”运算,此数在该位取1。

例如:有一数84,即01010100(2),想把其中从左边算起的第3,4,5,7,8位保留下来,运算如下:

01010100(2)
&00111011(2)
00010000(2)
即:a=84,b=59
c=a&b=16
c语言源代码:
#include 《stdio.h》
main()
{
int a=84;
int b = 59;
printf(“%d“,a&b);
}

2、“按位或”运算符(|)

两个相应的二进制位中只要有一个为1,该位的结果值为1。借用逻辑学中或运算的话来说就是,一真为真。例如:60(8)|17(8),将八进制60与八进制17进行按位或运算。

00110000
|00001111
00111111
c语言源代码:
#include 《stdio.h》
main()
{
int a=060;
int b = 017;
printf(“%d“,a|b);
}

应用:按位或运算常用来对一个数据的某些位定值为1。例如:如果想使一个数a的低4位改为1,则只需要将a与17(8)进行按位或运算即可。

3、“异或”运算符(^)

他的规则是:若参加运算的两个二进制位值相同则为0,否则为1

即0∧0=0,0∧1=1,1∧0=1, 1∧1=0

例:   00111001
∧ 00101010
00010011
c语言源代码:
#include 《stdio.h》
main()
{
int a=071;
int b = 052;
printf(“%d“,a^b);
}

应用:

(1)使特定位翻转设有数01111010(2),想使其低4位翻转,即1变0,0变1.可以将其与00001111(2)进行“异或”运算。

即:
01111010
^00001111
01110101

运算结果的低4位正好是原数低4位的翻转。可见,要使哪几位翻转就将与其进行∧运算的该几位置为1即可。

(2)与0相“异或”,保留原值

例如:012^00=012
00001010
^00000000
00001010

因为原数中的1与0进行异或运算得1,0^0得0,故保留原数。

(3) 交换两个值,不用临时变量

例如:a=3,即11(2);b=4,即100(2)。

想将a和b的值互换,可以用以下赋值语句实现:

a=a∧b;
b=b∧a;
a=a∧b;
a=011(2)
(∧)b=100(2)
a=111(2)(a∧b的结果,a已变成7)
(∧)b=100(2)
b=011(2)(b∧a的结果,b已变成3)
(∧)a=111(2)

a=100(2)(a∧b的结果,a已变成4)

等效于以下两步:

① 执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)。

② 再执行第三个赋值语句: a=a∧b。由于a的值等于(a∧b),b的值等于(b∧a∧b),因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b。

c语言源代码:
#include 《stdio.h》
main()
{
int a=3;
int b = 4;
a=a^b;
b=b^a;
a=a^b;
printf(“a=%d b=%d“,a,b);
}

4、“取反”运算符(~)

他是一元运算符,用于求整数的二进制反码,即分别将操作数各二进制位上的1变为0,0变为1。

例如:~77(8)

源代码:

#include 《stdio.h》
main()
{
int a=077;
printf(“%d“,~a);
}

5、左移运算符(《《)

左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。

例如:将a的二进制数左移2位,右边空出的位补0,左边溢出的位舍弃。若a=15,即00001111(2),左移2位得00111100(2)。

源代码:
#include 《stdio.h》
main()
{
int a=15;
printf(“%d“,a《《2);
}

左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<<2=60,即乘了4。但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。假设以一个字节(8位)存一个整数,若a为无符号整型变量,则a=64时,左移一位时溢出的是0,而左移2位时,溢出的高位中包含1。

6、右移运算符(》》)

右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。注意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。

例: a的值是八进制数113755:

a:1001011111101101 (用二进制形式表示)

a》》1: 0100101111110110 (逻辑右移时)

a》》1: 1100101111110110 (算术右移时)

在有些系统中,a》》1得八进制数045766,而在另一些系统上可能得到的是145766。Turbo C和其他一些C编译采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1。

源代码:
#include 《stdio.h》
main()
{
int a=0113755;
printf(“%d“,a》》1);
}

7、位运算赋值运算符

位运算符与赋值运算符可以组成复合赋值运算符。

例如: &=, |=, 》》=, 《《=, ∧=

例:  a & = b相当于 a = a & b

a 《《 =2相当于a = a 《《 2

如何滴水不漏的学完C语言?C语言程序中,使用移位操作代替乘除运算,真的效率更高吗

本文编辑:admin

更多文章:


奔腾t77三大件怎么样(一汽奔腾的质量怎么样三大件可靠吗)

奔腾t77三大件怎么样(一汽奔腾的质量怎么样三大件可靠吗)

本文目录一汽奔腾的质量怎么样三大件可靠吗一汽奔腾T77和现代ix25,该如何选择哪款车更可靠东风AX7、传祺GS5、哈弗F7和奔腾T77哪个更适合家用1.4980L是多少排量奔腾t77奔腾t77咋样奔腾T77这款车适合多大年纪的人开年轻人会

2023年11月17日 04:20

有米科技股份有限公司(有人能详细帮我介绍一下点米科技吗)

有米科技股份有限公司(有人能详细帮我介绍一下点米科技吗)

这篇文章给大家聊聊关于有米科技股份有限公司,以及有人能详细帮我介绍一下点米科技吗对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录有人能详细帮我介绍一下点米科技吗点米科技是一家科技公司吗国内pcb上市公司有哪些蓝思科技总部在哪里

2024年9月17日 05:00

106短信平台(如何申请106开头的短信平台)

106短信平台(如何申请106开头的短信平台)

本文目录如何申请106开头的短信平台106短信平台哪个好要求三网合一的106短信平台是什么企业应如何选择106短信平台106短信平台哪个正规106短信平台怎么关闭如何申请106开头的短信平台如果是找运营商申请的话就比较麻烦,要SP证,还要有

2024年7月23日 17:00

vista系统什么时候出的(VISTA系统是什么时候出的)

vista系统什么时候出的(VISTA系统是什么时候出的)

本文目录VISTA系统是什么时候出的vista是哪一年的系统windows vista系统什么时候出vista 系统是什么VISTA系统是什么时候出的Windows Vista 就是Windows NT 6.0。虽然有诸多新功能,但有如下致

2024年6月2日 20:02

华为儿童手表3s刷机教程图解(儿童手表怎么刷机)

华为儿童手表3s刷机教程图解(儿童手表怎么刷机)

本文目录儿童手表怎么刷机捡到华为儿童手表怎么刷机华为手表3s怎么把它不用软件就恢复出厂设置华为儿童手表3s刷机教程图解儿童手表怎么刷机1、双击打开界面。2、向左滑动4下,往下滑动,找到“绑定号”。3、打开二维码界面,连续点击二维码5下后长按

2024年6月6日 04:56

3dmark手机(手机3dMark跑分6825算高吗)

3dmark手机(手机3dMark跑分6825算高吗)

本篇文章给大家谈谈3dmark手机,以及手机3dMark跑分6825算高吗对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录手机3dMark跑

2023年12月25日 20:40

ipad4和ipad3对比(ipad3和ipad4的区别是什么)

ipad4和ipad3对比(ipad3和ipad4的区别是什么)

本文目录ipad3和ipad4的区别是什么ipad3跟ipad4有什么区别iPad3 iPad4该如何选择ipad3 4分别是什么处理器ipad各代对比ipad3和ipad4的区别ipad3和ipad4的区别是什么ipad1ipad2ipa

2023年4月30日 05:40

mp3推荐学生(学生党买什么mp3比较好,价格最好在200以下,要有歌单之类的,内存8g以上(以前没用过mp3))

mp3推荐学生(学生党买什么mp3比较好,价格最好在200以下,要有歌单之类的,内存8g以上(以前没用过mp3))

本文目录学生党买什么mp3比较好,价格最好在200以下,要有歌单之类的,内存8g以上(以前没用过mp3)什么MP3性价比高,学生党,最好带屏幕,只听歌就够了,顺便说下什么耳机好什么品牌的mp3好适合学生使用学生党买什么mp3比较好,价格最好

2024年7月22日 08:56

三星3g手机能下载微信吗(三星手机能下微信吗)

三星3g手机能下载微信吗(三星手机能下微信吗)

本文目录三星手机能下微信吗三星手机可以下微信吗我刚购了一款三星3G手机,请问如何使用微信三星三g手机下载不了微信三星W799 天翼3G的,到底能不能安装微信三星手机能下微信吗若手机不能下载软件,建议:1.检查手机内存是否已满,打开手机设定-

2024年7月17日 22:57

苹果siri侵权(小i机器人起诉苹果Siri侵权,苹果会如何处理此事)

苹果siri侵权(小i机器人起诉苹果Siri侵权,苹果会如何处理此事)

本文目录小i机器人起诉苹果Siri侵权,苹果会如何处理此事上海一公司向苹果索赔100亿,这其中的缘由是什么苹果的siri功能会泄漏隐私吗上海一公司要求停售iPhone,向苹果索赔100亿,事件最新进展如何小i机器人起诉苹果Siri侵权,事情

2024年6月6日 19:25

便携数码相机排行榜(有没有日常使用的便携相机推荐)

便携数码相机排行榜(有没有日常使用的便携相机推荐)

本文目录有没有日常使用的便携相机推荐哪种数码相机最适合家庭旅游使用最适合旅行的数码相机是哪款有没有日常使用的便携相机推荐对于摄影爱好者来说,单反和微单相机固然可以提供出色的拍摄性能,但是体积上的限制注定了不能天天随身携带。目前市场上还有一类

2024年6月6日 10:12

惠普笔记本电脑清灰(惠普笔记本清理灰尘)

惠普笔记本电脑清灰(惠普笔记本清理灰尘)

本文目录惠普笔记本清理灰尘hp笔记本如何清理灰尘惠普笔记本清灰多少钱惠普笔记本售后清灰多久惠普笔记本5390怎么打开清灰惠普笔记本清理灰尘打电话问一下,去他的服务点是最放心的。其实有人电脑用到坏都未必清过尘,但清一清也是对电脑好的。自己拆都

2023年8月19日 09:00

苹果11双电信卡技巧(苹果11怎么装两张卡)

苹果11双电信卡技巧(苹果11怎么装两张卡)

本文目录苹果11怎么装两张卡iphone11怎么双卡双待iphone11双卡流量怎么设置怎么可以苹果手机同时插两张电信卡苹果11双卡双待怎么用苹果11怎么使用双卡苹果11手机两张卡如何搭配最好苹果11怎么装两张卡苹果11插两张卡方法如下:1

2024年7月20日 09:05

索尼克手机游戏(一个游戏要偷到指定物品并逃出去并要找出三个狐狸是什么手机游戏)

索尼克手机游戏(一个游戏要偷到指定物品并逃出去并要找出三个狐狸是什么手机游戏)

本文目录一个游戏要偷到指定物品并逃出去并要找出三个狐狸是什么手机游戏推荐几个画面精美又好玩的手机单机游戏有一个左右摇晃手机,一个小怪物就左右移动吃金币上升的游戏索尼克手机游戏有哪些有个手机游戏,角色和索尼克有点像,手能伸的很长来回荡漾,蓝色

2024年7月22日 08:23

oppor5现在多少钱一部(oppor5价格多少钱)

oppor5现在多少钱一部(oppor5价格多少钱)

“oppor5现在多少钱一部”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看oppor5现在多少钱一部(oppor5价格多少钱)!本文目录oppor5价格多少钱OPPOR5现在市场价多少钱OPPOR5市场价最低多少钱oppo

2024年5月21日 07:48

手机出货量下降(中国信通院:7月国内市场手机出货量同比下降30.6%,这反映出了什么)

手机出货量下降(中国信通院:7月国内市场手机出货量同比下降30.6%,这反映出了什么)

其实手机出货量下降的问题并不复杂,但是又很多的朋友都不太了解中国信通院:7月国内市场手机出货量同比下降30.6%,这反映出了什么,因此呢,今天小编就来为大家分享手机出货量下降的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧

2024年1月14日 01:40

超便携笔记本报价(超便携笔记本买什么牌子好性价比高的)

超便携笔记本报价(超便携笔记本买什么牌子好性价比高的)

大家好,关于超便携笔记本报价很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于超便携笔记本买什么牌子好性价比高的的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本

2024年3月12日 15:35

佳能g12屏幕不显示了(佳能G12屏幕闪烁,黑屏怎么办)

佳能g12屏幕不显示了(佳能G12屏幕闪烁,黑屏怎么办)

大家好,关于佳能g12屏幕不显示了很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于佳能G12屏幕闪烁,黑屏怎么办的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

2024年6月6日 20:17

手机内存卡怎么安装(手机内存卡怎么安装 如何安装华为手机的内存卡)

手机内存卡怎么安装(手机内存卡怎么安装 如何安装华为手机的内存卡)

本文目录手机内存卡怎么安装 如何安装华为手机的内存卡内存卡怎么插到手机上 一步步详细教你华为手机如何装卡手机内存卡怎么换内存卡怎么用在手机上vivo手机怎么插内存卡荣耀9怎么安装内存卡oppo手机内存卡怎么装进去如何安装华为手机的内存卡(S

2023年6月11日 02:40

手机自由捏人建模软件3d(画凹凸自设的软件)

手机自由捏人建模软件3d(画凹凸自设的软件)

大家好,手机自由捏人建模软件3d相信很多的网友都不是很明白,包括画凹凸自设的软件也是一样,不过没有关系,接下来就来为大家分享关于手机自由捏人建模软件3d和画凹凸自设的软件的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本

2024年3月6日 01:55

近期文章

本站热文

4008827777转人工客服(4008827777饿了么怎么转人工电话)
2024-07-23 14:41:37 浏览:503
标签列表

热门搜索