题目描述:
所谓位运算,就是指在二进制下,按位进行与(&)、或(|)、非(~)、异或(^)、左移(<<)、右移(>>)的操作。 与(&)、或(|)、异或(^)运算需要两个运算数,按二进制位进行运算时,1当true,0为false进行运算,如:
5(101) & 7 (111) = 5 (101)。
左移1位,相当于乘2(因为所有的数在电脑中以二进制形式存储的),右移1位,相当于除2,如:x=1<<4; x的值为16。
位运算,速度快,同时使用与、或等运算,可以查看某个数在二进制下某一位的具体值,如:判断x在二进制下倒数第3位是不是为1,y=x & 1<<2,y>0则倒数第3位为1,否则为0。
现在给定一些位运算的表达式,求其值。
输入格式:
第1个数为1,后跟一个位运算表达式(只包含一个位运算符)。
第1个数为2,后跟两个数x,y,求x数在二进制下右起第y位是不是为1,是输出yes,否则输出no。
第1个数为3,后跟两个数x,y,求x数在二进制下把右起第y位置1,并输出x。
第1个数为4,后跟两个数x,y,求x数在二进制下把右起第y位置0,并输出x。
第1个数为5,后跟两个数x,y,求x数在二进制下把x左移y位。
第1个数为6,后跟一个数x,判断x是不是为2的n次方的数,若是输出yes,否则输出no。
输出格式:
一行,表示运算后的结果。
样例输入
样例1:
1 5&7
样例2:
2 15 3
样例3:
3 11 3
样例4:
5 10 4
样例5:
6 9
样例输出
样例1:
5
样例2:
yes
样例3:
15
样例4:
160
样例5:
no
My code(90pts)
#include<bits/stdc++.h>
using namespace std;
int n, a, b, ans;
char c;
int main(){
cin >> n;
if( n == 1 ){
cin >> a >> c;
if( c == '<' || c == '>' ) cin >> c;
cin >> b;
switch( c ){
case '&':
printf( "%d", a&b );
return 0;
case '|':
printf( "%d", a|b );
return 0;
case '^':
printf( "%d", a ^ b );
return 0;
case '<':
printf( "%d", a<<b );
return 0;
case '>':
printf( "%d", a>>b );
return 0;
}
}
if( n == 2 ){
cin >> a >> b;
ans= a&(1<<(b-1)) ;
if( ans ) cout << "yes";
else cout << "no";
}
if( n == 3 ){
cin >> a >> b;
ans = a&(1<<(b-1) ) ;
if( ans ) cout << a;
else{
ans = 1<<(b-1);
cout << a + ans;
}
}
if( n == 4 ){
cin >> a >> b;
ans= a&(1<<(b-1));
if(!ans) cout<<a;
else{
ans=1<<(b-1);
cout << a - ans;
}
}
if( n == 5 ){
cin >> a >> b;
ans = a<<b;
cout << ans;
}
if( n==6 ){
cin >> a;
if(a&(a-1)==0) cout << "yes";
else cout << "no";
}
return 0;
}