zoukankan      html  css  js  c++  java
  • 简单位运算

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

    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

  • 相关阅读:
    wikiquote
    zz 勵志貼,成功是努力加对的方向
    # 电纸书
    # 崔寶秋
    好的程序員
    深度学习引擎
    再见乱码:5分钟读懂MySQL字符集设置
    Linux基础:用tcpdump抓包
    Linux基础:文件查找find
    Linux基础:xargs命令
  • 原文地址:https://www.cnblogs.com/Untergehen/p/14290054.html
Copyright © 2011-2022 走看看