zoukankan      html  css  js  c++  java
  • careercup-位操作5.1

    5.1 写程序使整数N中第i位到第j位的值与整数M中的相同。

    题目

    给定两个32位的数,N和M,还有两个指示位的数,i和j。 写程序使得N中第i位到第j位的值与M中的相同(即:M变成N的子串且位于N的第i位和第j位之间)

    例子:

    输入: N = 10000000000, M = 10101, i = 2, j = 6

    输出: N = 10001010100

    解答

    方案1:先将N中第0位到第i位保存下来(左闭右开:[0, i)),记作ret, 然后将N中第0位到第j位全清0([0, j]),通过向右移动j+1位然后再向左移动j+1位得到。 最后用上面清0后的值或上(m<<i)再或上ret即可。

    代码如下:

    int update_bits(int n, int m, int i, int j){
        int ret = (1 << i) -1;
        ret &= n;
        return ((n>>(j+1)) << (j+1)) | (m<<i) | ret;
    }

    方案2:用一个左边全为1,中间一段全为0(这段的长度与m长度一样), 右边全为1的掩码mask去和n按位与,得到的值是将n中间一段清0的结果。 然后再与m左移i位后按位或,得到最终结果。

    代码如下:

    int update_bits1(int n, int m, int i, int j){
        int max = ~0;   //全为1
        int left = max - ((1 << j+1) - 1);
        int right = ((1 << i) -1);
        int mask = left | right;
        return (n & mask) | (m << i);
    }
  • 相关阅读:
    H5 使用 jssdk 出现的问题 错误码:63002 签名错误
    vue 使用 scss
    JS之常用字符串处理类
    hive数仓中两个维度表如果想合并纬度产生新自增ID方法
    叉乘,判线段相交,凸包
    二分查找
    大整数运算
    判定最小生成树是否唯一
    Prim算法
    Boruvka算法
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4148475.html
Copyright © 2011-2022 走看看