zoukankan      html  css  js  c++  java
  • 位操作

    1. 如果n为2的幂,则

    a%n = a & (n-1)

    2. mod运算规则:

    结合律
    ((a+b) mod p + c)mod p = (a + (b+c) mod p) mod p
    ((a*b) mod p * c)mod p = (a * (b*c) mod p) mod p
    交换律
    (a + b) mod p = (b+a) mod p
    (a × b) mod p = (b × a) mod p
    分配律
    ((a +b)mod p × c) mod p = ((a × c) mod p + (b × c) mod p) mod p
    (a×b) mod c=(a mod c * b mod c) mod c
    (a+b) mod c=(a mod c+ b mod c) mod c
    (a-b) mod c=(a mod c- b mod c) mod c

    3. 判断一个数n是否是2的幂:

    n > 0 && ((n & (n - 1)) == 0 )

    4. 最高位1对应的整数:

        /**
         * Returns an {@code int} value with at most a single one-bit, in the
         * position of the highest-order ("leftmost") one-bit in the specified
         * {@code int} value.  Returns zero if the specified value has no
         * one-bits in its two's complement binary representation, that is, if it
         * is equal to zero.
         *
         * @return an {@code int} value with a single one-bit, in the position
         *     of the highest-order one-bit in the specified value, or zero if
         *     the specified value is itself equal to zero.
         * @since 1.5
         */
        public static int highestOneBit(int i) {
            // HD, Figure 3-1
            i |= (i >>  1);
            i |= (i >>  2);
            i |= (i >>  4);
            i |= (i >>  8);
            i |= (i >> 16);
            return i - (i >>> 1);
        }

    5. 最低位1对应的整数:

        /**
         * Returns an {@code int} value with at most a single one-bit, in the
         * position of the lowest-order ("rightmost") one-bit in the specified
         * {@code int} value.  Returns zero if the specified value has no
         * one-bits in its two's complement binary representation, that is, if it
         * is equal to zero.
         *
         * @return an {@code int} value with a single one-bit, in the position
         *     of the lowest-order one-bit in the specified value, or zero if
         *     the specified value is itself equal to zero.
         * @since 1.5
         */
        public static int lowestOneBit(int i) {
            // HD, Section 2-1
            return i & -i;
        }

    其实是i&(i-1的补数),因为i的补数加1等于-i,所以i的补数=-(i+1),i-1的补数=-i。

    i+i的补数=0xFFFFFFFF,i+(-i-1)=0xFFFFFFFF

    6. 前面0的个数:

        public static int numberOfLeadingZeros(int i) {
            // HD, Figure 5-6
            if (i == 0)
                return 32;
            int n = 1;
            if (i >>> 16 == 0) { n += 16; i <<= 16; }
            if (i >>> 24 == 0) { n +=  8; i <<=  8; }
            if (i >>> 28 == 0) { n +=  4; i <<=  4; }
            if (i >>> 30 == 0) { n +=  2; i <<=  2; }
            n -= i >>> 31;
            return n;
        }

    显然采用了二分的算法,不过从计算机的角度,移两次位应该是移一次位的两倍时间(猜测),这样的二分真的合适吗

    7. 后面0的个数:

        public static int numberOfTrailingZeros(int i) {
            // HD, Figure 5-14
            int y;
            if (i == 0) return 32;
            int n = 31;
            y = i <<16; if (y != 0) { n = n -16; i = y; }
            y = i << 8; if (y != 0) { n = n - 8; i = y; }
            y = i << 4; if (y != 0) { n = n - 4; i = y; }
            y = i << 2; if (y != 0) { n = n - 2; i = y; }
            return n - ((i << 1) >>> 31);
        }
  • 相关阅读:
    Tensorflow2.0基础
    Tensorflow2.0多层感知机实现mnist手写数字识别
    numpy数组的维度操作和axis的对应关系
    jupyter notebook使用
    darknet批量测试并保存图片
    darknet训练自身数据集的小问题
    PIL批量更改图片格式 及bat/cmd文件批量修改文件后缀名
    cv::Mat用法
    VS配置opencv、cuda及调用yolo动态链接库
    VS之 32 or 64
  • 原文地址:https://www.cnblogs.com/drizzlewithwind/p/6878901.html
Copyright © 2011-2022 走看看