简单位运算

判断奇偶,二进制的运算,组合的遍历......等问题都要用到位运算,所以做个小记录。

  1. & 按位与      如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
  2. | 按位或      两个相应的二进制位中只要有一个为1,该位的结果值为1。
  3. ^ 按位异或    若参加运算的两个二进制位值相同则为0,否则为1。
  4. ~ 取反        ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0。
  5. << 左移       用来将一个数的各二进制位全部左移N位,右补0。(相当于乘以2)
  6. >> 右移       将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0。
  7. 位运算符与赋值运算符可以组成复合赋值运算符。
       例如: &=, |=, >>=, <<=, =
       例:  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("
");
        }
        printf("
");
    }
    return 0;
}

 不知道自己这样想对不对,总之是这样的思路,如果有错的地方欢迎斧正。

相关库函数:

https://blog.csdn.net/qq_40679299/article/details/80224547

码题:

137. Single Number II

http://www.fjutacm.com/Problem.jsp?pid=3151

原文地址:https://www.cnblogs.com/Untergehen/p/14290054.html