标签:

位运算

描述:

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)

 解题思路:
1.这道题给出了四个int型的整数,其中m,n是两个给定的整数,而i与j则是前后两位的区间,例如i =2 , j =6 就是将n中的第二位到第六位变换为m
2.此题引入了一个掩码的概念(mask):
   (1) 初始的时候所有位都为1:ones = ~0
   (2) left :将ones 所有的位都向左移动j位+1 left = (ones<< j) + 1,形成mask左边部分(之所以加1是因为第一位是符号位1)
     (3)  right : 将1同时也向左移动i位,再减去1,right = (1<<i)-1(之所以减去1是因为,要空出第i位,从i-1位变成1)
   (4)将left和right来做或的运算,可以得到mask,正好得到前面所有的1和后面所有的1,空出中间的0,从而得到mask
 (5)对于mask其实存在一个corner case就是如果j>31 的情况, 在此left方向就会溢出,此时只需要计算right部分即可,因为题目中保证存在足够的空间进行位移,所以不考虑溢出。 
3. 将mask 与 n来做与运算,从而可以将mask其他的位置上的数字变为与n相同的
4. 将m向前移动i位,正好可以与mask中预留出来的所有的0对齐,再与第三步得到的结果进行或运算,将m中的内容插入n中的指定位置。
5. 最后的表达形式为:(n&mask) | (m<<i) 
参考代码:
http://www.kancloud.cn/kancloud/data-structure-and-algorithm-notes/72988

最新文章

  1. Git : SSH 协议服务器
  2. plain framework 商业版 开发总结1 updated
  3. AngularJs ng-repeat限制循环次数
  4. spring-aop学习【基于注解】
  5. Android开发学习——开发调试工具-DDMS应用,ADB进程,Logcat
  6. JS写小游戏(一):游戏框架
  7. If you only do what you can do you&#39;ll never be more than you are now.
  8. Mysql一些复杂的语句
  9. Solr之搭建Solr5.2.1服务并从Mysql上导入数据
  10. Block(一)基础-备
  11. c#获取新浪微博登录cookie
  12. (转).tar.gz文件和.rpm文件的区别
  13. 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的
  14. Linux 配置163yum源epel 源
  15. python3 练手实例1 计算三角形周长和面积
  16. kafka consumer 0.8.2.1示例代码
  17. Nopcommerce安装,应用及二次开发视频
  18. ES5数组的遍历方式
  19. Spring Cloud 入门教程(九): 路由网关zuul
  20. Codeforces 767D - Cartons of milk

热门文章

  1. Android SDK上手指南:应用程序发布
  2. JS中的一些函数式编程术语
  3. java udp协议DatagramSocket类使用
  4. Leetcode463.Island Perimeter岛屿的周长
  5. NPM:如何配置maven npm私服
  6. 使用代码创建rabbitmq交换机和队列绑定
  7. springboot框架实现启动项目执行指定代码
  8. 【python之路30】反射
  9. Hackerrank--Prime Sum
  10. SPSS正交设计的操作