位运算符合基本概念

位运算:用于对 整数类型(int,char,long等等)变量中的某一位(bit)或者若干bit位的操作;在移位运算时,byte、 short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。
1字节(Byte)=8比特(bit);那么1字节即包含8位二进制数;例: (10001111)2
就是一个字节那么大;

接下来,来一波几个位运算符; (>>,<<;~;&;I;^)
1.左右移位算符<<" ,">>"顾名思义,位的左右移动;
例:若a为无符号整型,a=127=(0111 1111)2; 2^8=256;
a<<1=(1111 1110) 2=1272=254
and a<<2=(1111 1100)2=252!=127
4

是不是想到了二进制大法 ;252=127*4对256的取模
a>>1=(0011 1111)2=63=127/2
a>>2=(0001 1111)2=31=127/4

总结:左移n位相当于乘上2的n次方,右移n位,就相当于左操作数除以n次2 ,并且将结果往小里取整(-25 >> 4 = -2;-2 >> 4 = -1;18 >> 4 = 1)
2按位非运算符”~”:按位取反,即0变1,1变0;
例:21: 0001 0101; ~21:1110 1010;~21=-22;
1:0000 0001;~1:1111 1110; ~1=-2;
可以作为循环输入结束条件判断语句
while(~scanf("%d",n))或while(scanf("%d",n)!=-1);
3按位与“&”:两个相应的二进制位都为1,则该位的结果为1,否则为0;
例:18:0001 0010 21: 0001 0101 1:0000 0001;
18&21=16=(0001 0000)2 18&1=0=(0000 0000)2
21&1=(0000 0001)=1
总结:该运算符可以把变量中某些位清零且同时保留其他位不变,通常用于获取某变量中的某一位;如果需要将int型变量n的低8位全置成0,而其余位
不变,则可以执行:n = n & 0xffffff00;
4按位或“|”:只有对应的两个二进位都为0时,结果的对应
二进制位才是0,否则为1。或者说两个二进制位只要有一个为1,则该位结果为1,否则为0;

例:18:0001 0010 21: 0001 0101
18|21=23=(0001 0111)2
总结:与按位与相反,通常把变量中某些位变成1且保留其他位不变.
5按位异或”^“:两个二进位相同时,结果的对应二进制位是0,否则为1。
或者说,两个二进位不相同时,结果的对应二进制位才是1,否则为0。

异或运算的特点是:
如果 a^b=c,那么就有 c^b = a以及c^a=b。

#include  <stdlib.h>//ab两数交换,
void main()
{ 
int a = 5, b = 7;//5=(0000 0101)2 7=(0000 0111)2
a = a ^ b;printf("%d\t",a); //a=(0000 0010)2=2
b = b ^ a;printf("%d\t",b); //b=(0000 0101)2=5
a = a ^ b;printf("%d\n",a);  //a=(0000 0111)2=7
printf("a=%d,b=%d\n",a,b);
}

在这里插入图片描述
典例:有两个int型的变量a和n(0 <= n <= 31),
要求写一个表达式,使该表达式的值和a的第n位相同。
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值