首页 > 代码库 > careercup-位操作5.1
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);}
careercup-位操作5.1
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。