答案是9
符号^是异或的意思,也就是两个操作位,如果是不同的,则计算结果是1
符号<<是左位移的意思,按位移动
c=a^b<<2 的计算顺序是先计算b<<2,即2<<2得8
然后计算 a^8 = 1^8 = (2进制)0001^(2进制)1000 = (2进制)1001 = 9
这是位运算:
根据编译器计算结果是:9 说明它的运算顺序是从右至左运算的。
先计算b<<2 b=0010 左移两位结果是: b=1000
再计算a或b a=0001 b=1000 相或结果为 c=1001 也就是9
如果你对位运算不太理解,我把我的笔记给你吧。
下面是我在学习位运算时的笔记,你看下吧,很清楚的,看明白后就懂了。
位与字节
1,按位运算也就是对字节或字中的实际位进行检测,设置或移位。
2,C语言中的位运算符有:
运算符 功能 运算符 功能 运算符 功能
& 按位与 ~ 取反 << 左移
| 按位或 ^ 按位异或 >> 右移
3,按位与运算符(&):是双目运算符,功能是使参与运算的两数各对应的二进位相“与”,只有对应的两个二进位均为1 时,结果为1,否则为0.
如:0000000000010110
& 0000000010001101
结果为:0000000000000100
//与运算的一个作用是清零,可以设法将一个原数中为1的位置0,只要将它与全部为0的数进行与运算即可。
//与运算的另一个作用是取特定位,可以通过与的方式取一个数中的某些指定位。如上可以对结果取位数为1的位。
4,按位或运算符(|)是双目运算符,功能是使参与运算的两数中各对应的二进位相或,只要对应的两个二进数有一个为1 时,结果就为1,否则为0.
5,按位取反运算符(~)为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反,即将0变为1,将 来变为0.
//在进行取反运算的过程中切不可简单地认为对一个数取反后的结果就是该数的相反数(即~25就是-25)这是错误的, 按位求反是对二进制数按位取反。
6,按位异或运算符(^)是又目运算符,其功能是使参与运算的两数各对应的二进位相异或,当对应的两个二进位数相异或 时,两数都为1时结果为0,有一个数为1时,结果为1,其它情况也为0.
//异或操作的一个主要用途就是能使特定的位翻转,另一个主要用途就是在不使用临时变量的情况下实现两个变量值的 互换。
//异或运算经常用到一些比较简单的加密算法中。
7,左移运算符(<<)是双目运算符,其功能是把"<<"运算符左边的运算数的各二进位全部左移若干位,移动的位数由"<<" 运算符右边的数指定,高位丢弃,低位补0。 如:a<<2 //代表a的二进数向左移动2位。
//实际上左移一位相当于该数乘以2,称动2位 相当于该数乘以4,以此类推。这种情况只限于移动位不含1的情况。
8,右移运算符(>>)是双目运算符,其功能是把">>"运算符左边的运算数的各二进位全部右移若干位,移动的位数按">>" 运算符右边的数指定。
//在进行右移时对于有符号的数需要注意符号问题,当为正数时,最高位补0,而为负数时,最高位补0或1取决于编译 系统的规定,移入0的称为"逻辑右移",移入1的称为"算术右移"。(visualC++)是以算术右移。
循环移位
1,循环移位就是将移出的低位放到该数的高位或者移出高位放到该数的低位。
如:a.00110000,00000000,11010000,00001011 左循环移动4位
z.10110000,00000000,00000000,00000000 先左移32-4=28位后的结果。 公式为:z=a<<(32-n) //此时n=4
y.00001100.00000000,00001101.00000000 再右移4位的结果。 y=a>>n
a.10111100.00000000,00001101.00000000 这就是循环左移4位的结果。 a=z|y
2,右循环移动的方法类似,只需要转换即可。
1^1=0 0^0=0 1^0=1 0^1=0
0001 1100
^ 1000 ^ 1001
= 1001 = 0101