简单位运算
判断奇偶,二进制的运算,组合的遍历......等问题都要用到位运算,所以做个小记录。
- & 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
- | 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1。
- ^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1。
- ~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0。
- << 左移 用来将一个数的各二进制位全部左移N位,右补0。(相当于乘以2)
- >> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0。
- 位运算符与赋值运算符可以组成复合赋值运算符。
例如: &=, |=, >>=, <<=, ∧=
例: a & = b相当于 a = a & b
a << =2相当于a = a << 2
例题和代码。
http://www.fjutacm.com/Problem.jsp?pid=1848
组合的遍历
#include<stdio.h> #include<string.h> int main() { int n,l,a; char str[10]; while(~scanf("%d",&n)){ a=1; a<<=n; a--;//一共有a种组合(排除000) for(int i=1;i<=a;i++){ int pl=i;//(一种一种的遍历) memset(str,0,sizeof(str)); int k=0; while(pl){ if(pl&1){//从001开始 str[k]='a'+k;//第一位&1=1为a,第二位b,依此类推... } else str[k]='.';//如果&1!=1就用其他的字符占位 k++; pl>>=1;//下一位 } for(int j=9;j>=0;j--){//先输出后面的位 if(str[j]>='a'&&str[j]<='z')//判断是否是字母 printf("%c",str[j]); } printf("\n"); } printf("\n"); } return 0; }
不知道自己这样想对不对,总之是这样的思路,如果有错的地方欢迎斧正。
相关库函数:
https://blog.csdn.net/qq_40679299/article/details/80224547
码题:
http://www.fjutacm.com/Problem.jsp?pid=3151