c语言变量和1异或1,C的、、、、异或、~、!运算

c语⾔变量和1异或1,C的、、、、异或、~、!运算
位运算是指按⼆进制进⾏的运算。在系统软件中,常常需要处理⼆进制位的问题。C语⾔提供了6个位操作运算符。这些运算符只能⽤于整型操作数,即只能⽤于带符号或⽆符号的char,short,int与long类型。
C语⾔提供的位运算符列表:
运算符 含义 描述
& 按位与 如果两个相应的⼆进制位都为1,则该位的结果值为1,否则为0
| 按位或 两个相应的⼆进制位中只要有⼀个为1,该位的结果值为1
^ 按位异或 若参加运算的两个⼆进制位值相同则为0,否则为1
~ 取反 ~是⼀元运算符,⽤来对⼀个⼆进制数按位取反,即将0变1,将1变0
<< 左移
⽤来将⼀个数的各⼆进制位全部左移N位,右补0
>> 右移
将⼀个数的各⼆进制位右移N位,移到右端的低位被舍弃,对于⽆符号数,⾼位补0
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
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
main()
{
int a=43;
int b = 148;
printf("%d",a&b);
c4烯烃}
(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
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
黑山论坛
main()
{
int a=060;
int b = 017;
彭清泉
printf("%d",a|b);
}
应⽤:按位或运算常⽤来对⼀个数据的某些位定值为1。例如:如果想使⼀个数a的低4位改为1,则只需要将a与17(8)进⾏按位或运算即可。
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,等于b。
很神奇吧!
c语⾔源代码:
#include
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
main()
{
int a=077;
printf("%d",~a);
}
5、左移运算符(<
左移运算符是⽤来将⼀个数的各⼆进制位左移若⼲位,移动的位数由右操作数指定(右操作数必须是⾮负值),其右边空出的位⽤0填补,⾼位左移溢出则舍弃该⾼位。
例如:将a的⼆进制数左移2位,右边空出的位补0,左边溢出的位舍弃。若a=15,即00001111(2),左移2位得00111100(2)。
源代码:
#include
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
main()
{
int a=0113755;
printf("%d",a>>1);
}
7、位运算赋值运算符
位运算符与赋值运算符可以组成复合赋值运算符。
例如: &=, |=,
>>=,
<<=, ∧=
例: a & = b相当于
蓝国土a = a & b

本文发布于:2024-09-20 18:32:16,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/414743.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:进制   运算符   运算   数据   符号   右移   赋值   单位
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议