Update Bits

Given two 32-bit numbers, N and M, and two bit positions, i and j. Write a method to set all bits between i and j in N equal to M (e g , M becomes a substring of N located at i and starting at j)

Notice

In the function, the numbers N and M will given in decimal, you should also return a decimal number.

Clarification

You can assume that the bits j through i have enough space to fit all of M. That is, if M=10011, you can assume that there are at least 5 bits between jand i. You would not, for example, have j=3 and i=2, because M could not fully fit between bit 3 and bit 2.

Example

Given N=(10000000000)2M=(10101)2i=2j=6

return N=(10001010100)2

分析:http://www.kancloud.cn/kancloud/data-structure-and-algorithm-notes/72988

大致步骤如下:

  1. 得到第i位到第j位的比特位为0,而其他位均为1的掩码mask
  2. 使用mask与 N 进行按位与,清零 N 的第i位到第j位。
  3. 对 M 右移i位,将 M 放到 N 中指定的位置。
  4. 返回 N | M 按位或的结果。

获得掩码mask的过程可参考 CTCI 书中的方法,先获得掩码(1111...000...111)的左边部分,然后获得掩码的右半部分,最后左右按位或即为最终结果。

 1 class Solution {
 2 public:
 3     /**
 4      *@param n, m: Two integer
 5      *@param i, j: Two bit positions
 6      *return: An integer
 7      */
 8     int updateBits(int n, int m, int i, int j) {
 9         // write your code here
10         int ones = ~0;
11         int mask = 0;
12         if (j < 31) {
13             int left = ones << (j + 1);
14             int right = ((1 << i) - 1);
15             mask = left | right;
16         } else {
17             mask = (1 << i) - 1;
18         }
19
20         return (n & mask) | (m << i);
21     }
22 };
时间: 2024-11-07 17:15:29

Update Bits的相关文章

Lintcode: Update Bits

Given two 32-bit numbers, N and M, and two bit positions, i and j. Write a method to set all bits between i and j in N equal to M (e g , M becomes a substring of N located at i and starting at j) Have you met this question in a real interview? Yes Ex

解决win10无法完成更新 正在撤销更改

删除Windows 更新缓存文件按Windows+X,选择“命令提示符(管理员)”:输入:net stop wuauserv,回车(此处会提醒服务停止):输入: %windir%\SoftwareDistribution,回车,删除Download和DataStore文件夹中的所有文件: ================================再次输入:net start wuauserv,回车(此处会提醒服务开启):最后在Windows Update中,再次尝试检查更新.同时请您根据以

Web QQ 协议 登录加密算法 —— VC++实现

BOOL ToHexStr(const CHAR * lpStr, int nSrcLen, CHAR * lpHex, int nDestLen) { const CHAR cHexTable[] = "0123456789ABCDEF"; if (lpStr == NULL || nSrcLen <= 0 || lpHex == NULL || nDestLen <= 0) return FALSE; if (nDestLen <= nSrcLen * 2) re

win10更新时遇到错误0x80070002的正确处理方法

win10更新Flash Player.或者在  “启用或关闭windows功能” 经常出现提示错误0x80070002,这要怎么解决呢?这里介绍下正确的错误代码0x80070002解决办法. 严肃提示:网上其他的方法都是胡扯,根本不管用. 一.首先清除所有windows更新缓存 1.按Windows+X,选择“命令提示符(管理员)”: 2.输入:net stop wuauserv,回车(此处会提醒服务停止):        3.删除C:\windows\softwareDistribution

AM335x(TQ335x)学习笔记——WM8960声卡驱动移植

经过一段时间的调试,终于调好了TQ335x的声卡驱动.TQ335x采用的Codec是WM8960,本文来总结下WM8960驱动在AM335x平台上的移植方法.Linux声卡驱动架构有OSS和ALSA两种架构,目前最常用的架构是ALSA,本文也使用ALSA架构对WM8960驱动进行移植. ASoC是对ALSA驱动架构的进一步封装.ASoC将ALSA驱动中的各模块抽象为三部分:Platform.Codec和Machine.Platform主要是平台硬件驱动,包括SoC的IIS模块.DMA等,在本文中

C++ md5 函数

转 http://www.zedwood.com/article/cpp-md5-function    MD5 is no longer considered cryptographically safe for digital signatures, however, because the md5 hash function is still useful for other purposes, code is provided below. SHA2 (usually sha256) i

Win10更新补丁失败后出现无法更新正在撤销 解决办法

系统更新失败,反复重启还是不行,那是不是下载下来的补丁没用了呢??所以我们先要删除Windows更新的缓存文件!在做以下操作之前,首先我们要确认系统内的windows update & BITS服务设置是否开启. 检查方法: 1.按“Win+R”组合键打开运行,输入“services.msc”,点击确定(如果弹出用户账户控制窗口,我们点击“继续”). 2.双击打开“Background Intelligent Transfer Services”服务. 3.在选项卡点击“常规”,要保证“启动类型

MD5 校验文件

https://blog.csdn.net/wudishine/article/details/42466831 MD5.h #ifndef MD5_H #define MD5_H #include <string> #include <fstream> /* Type define */ typedef unsigned char byte; typedef unsigned long ulong; using std::string; using std::ifstream;

493. Reverse Pairs(BST, BIT, MergeSort)

Given an array nums, we call (i, j) an important reverse pair if i < j and nums[i] > 2*nums[j]. You need to return the number of important reverse pairs in the given array. Example1: Input: [1,3,2,3,1] Output: 2 Example2: Input: [2,4,3,5,1] Output: