zoukankan      html  css  js  c++  java
  • 位运算之a^b

    题目链接:https://www.acwing.com/problem/content/91/

    参考链接:https://blog.csdn.net/chaiwenjun000/article/details/71154235

           https://blog.csdn.net/qq_30076791/article/details/50571194

           https://blog.csdn.net/riba2534/article/details/79834558

    1. 判断一个数字x二进制下第i位是不是等于1。

      方法:if ( ( ( 1 << ( i - 1 ) ) & x ) > 0)

      将1左移i-1位,相当于制造了一个只有第i位上是1,其他位上都是0的二进制数。然后与x做与运算,如果结果>0,说明x第i位上是1,反之则是0。

    2. 将一个数字x二进制下第i位更改成1。

      方法:x = x | ( 1<<(i-1) )

      证明方法与1类似,此处不再重复证明。

    3. 把一个数字二进制下最靠右的第一个1去掉。

      方法:x=x&(x-1)

    • 二进制中子集的个数以及每个子集的具体内容

    比如有5个小球,如果每个小球都被选中的话,这可以用二进制11111来表示。依此类推如果都没有被选中,则是00000。那么求出这5个小球被选中的所有可能状态,用二进制表示。

    public class Main {
        public static void main(String[] args) {
            int x= (int) (Math.pow(2,5)-1);//表示5个小球都被选中的状态11111:十进制表示为2^5-1
            int n=0;
            for(int i=x;i!=0;){
                i=(i-1)&x;
                n++;
                System.out.println(Integer.toBinaryString(i));//每个子集的具体内容
            }
            System.out.println("n=="+n);//子集个数
        }
    }
    • 判断一个数是不是偶数

    只需判断最后一位是1还是0。最后一位是1,说明是奇数。最后一位是0,说明是偶数。因为只有2的0次方才是奇数值1,其他的2的k(k = 1,2,….)都是偶数

    public class Main {
        public static void main(String[] args) {
            int a=4;
            if((a & 1)!=0)
                System.out.println( "是奇数" );
            else
                System.out.println( "是偶数" );
        }
    }

    快速幂

    快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高

    以下以求a的b次方来介绍 
    把b转换成二进制数
    该二进制数第i位的权为
     
    例如
    11的二进制是1011
    11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
    因此,我们将a¹¹转化为算
     
    以上是初中公式,翻一下书就知道。
    public static void main(String[] args) {
            int a=3;//底数
            int b=4;//指数
            int res=1;//结果
            while (b!=0){
                if((b&1)!=0)//只有二进制不为0
                    res*=a;
                a=a*a;
                b=b>>1;
            }
            System.out.println(res);
        }

    a^b%mod解答

    数学定理:某两个正整数的积与某正整数相除得到的余数同这两个数分别除以该数所得的余数的积相等

    static long solve(long a, long b,long p) {
            long ans = 1;
            long base = a;
            if (b==0) {
                return 1%p;
            }
            while (b != 0) {
                if ((b & 1) != 0)
                {    ans *= base;// 该位为1,应该乘对应基数;
                    ans%=p;
                }
                base = base * base%p;// 基数更新;
                b = b >> 1;// 同b/=2;
            }
            return ans;
        }
    加油啦!加油鸭,冲鸭!!!
  • 相关阅读:
    JAVASCRIPT函数定义表达式和函数声明的区别
    单链表
    Asp.net+jquery+ajaxpro异步仿Facebook纵向时间轴效果
    基于Hadoop开发网络云盘系统客户端界面设计初稿
    U盘安装CentOS 6.4 + Windows 7双系统 (Windows 7下安装 CentOS 6.4)
    Last_SQL_Errno: 1050
    delphi 7中使用idhttp抓取网页 解决假死现象(使用TIdAntiFreezeControl控件)
    继承CWnd自绘按钮
    gcc编译器对宽字符的识别
    解决Qt程序发布时中文乱码问题(通过QApplication.addLibraryPath加载QTextCodec插件)
  • 原文地址:https://www.cnblogs.com/clarencezzh/p/10293748.html
Copyright © 2011-2022 走看看