问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言中移位运算的详细解释。

发布网友 发布时间:2022-03-30 06:04

我来回答

1个回答

热心网友 时间:2022-03-30 07:33

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

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
可以教会聋哑人说话吗 我是一位聋哑的男孩,想学说话,不会说话,怎么办 聋哑人可以说话吗 雾炮机工作原理是什么? 等离子火焰清洗机 vigi是什么意? 加尔文和马丁路德的区别是什么?区别很大吗? 玄参目分类介绍 如何根据植物形态判断科属 植物学小白怎么鉴定植物标本? 如何关闭U盘自动播放? 现代名图是b级车吗 怎样关闭北京现代图名汽车启动时就自动播放的收音机? 如何设置关电脑 自动定时开机播放和关机 11款卡罗拉每次启动车辆都会自动播放收音机怎么关闭? 怎么关闭windowsXP自动播放功能?????? Ikf耳机怎么把自动播放关了 手机自动播放广告机如何关闭? 手机自动播报短信如何关闭 铁血丹心全本 oppo手机自动播放音乐怎么关闭 Java中右移运算 右移运算符的作用 高德地图上的商家图片如何修改 在高德地图上我已注册了自己的店铺,但如何上传菜单? 高德地图我没上传位置店铺照片,为什么上传了?一般什么人上传的?别人谁上传的? 看到周围的店铺都能在高德地图附近中找到,也想,把自己的店铺上传,但不懂方法求指教 高德地图怎么添加拍好的照片 怎么把自己的店铺位置上传到地图上 vivo手机丢了 ,如何寻回 平板摔了,黑屏了,怎么办? 平板电脑摔了一下花屏了怎么办? 平板电脑摔地上后触摸屏不灵了怎么办? 我的平板电脑摔过了,不能点屏幕了,该怎么办? ipad摔了一下黑屏了怎么办 平板电脑摔坏了怎么办 平板电脑在家摔黑屏了怎么在家修? 我就的平板电脑刚被我不小心一坐到触屏裂开,有一边还能触屏一边不能了,是不是只有触屏坏阿? 平板电脑摔坏了怎么办 Ipad不小心摔一几下会不会有什么问题? Ipad后盖摔坏怎么办 老师把学生的学习平板电脑摔了怎样处理? 平板电脑摔坏了怎么办 华硕平板电脑不小心摔坏了屏幕,修理大概多少钱? 平板电脑屏幕摔坏了,还能修吗 平板电脑屏幕摔了失灵了,刚才不小心又摔了一下没反应了? 苹果x自定义铃声设置 葛根粉怎么冲调? 葛根粉要怎么冲泡才正确 葛根粉怎样冲泡?