文档章节

M插入N,使得M从N的第j位开始,到第i位结束

一贱书生
 一贱书生
发布于 2016/11/18 15:06
字数 636
阅读 5
收藏 0

/**

 * 功能:给定两个32位的整数N与M,以及表示比特位置的i与j。编写一个方法,将M插入N,使得M从N的第j位开始,

 * 到第i位结束。假定从j为到i位足以容纳M,也即若M=10011,那么j和i之间至少可以容纳5个位。例如,不可能出现j=3

 * 和i=2的情况,因为第3位和第2位之间放不下M。

 */

 

x & (~0  << n):相当于把x最右边的n位清零

还有一些:(0s,1s表示一串0和一串1)

x ^ 0s = x

x ^ 1s = ~x

x ^ x = 0

 

x & 0s = 0

x & 1s = x

x & x = x

 

x | 0s = x

x | 1s = 1

x | x = x

常见的位操作:获取,设置, 清楚以及更新位数据

1. 获取某一位是1还是0:

将1左移i位,得到形如00001000的值,然后对这个值与num执行“位与”操作,从而将i位之外的的左右位清零,最后,检查该结果是否为0 ,为0,说明i位为0,否则说明i位为1

 

  1. boolean getBit(int num, int i) {  
  2.         return ( (num & ( 1 << i )) != 0);  
  3.     }  


2. 将第i位置为1,将1左移i位,得到形如00001000的值,接着对这个num执行“位或”操作,这样只会改变i位的数据,不会影响num的其余位

 

  1. boolean setBit(int num, int i) {  
  2.         return num | ( 1 << i );  
  3.     }  


3. 将第i位清零, 与setBit刚好相反, 将1左移i位,得到形如00001000的值,再取反,得到形如11110111的值,接着对这个num执行“位与”,这样只会清零i位,不会影响num的其余位

 

  1. boolean clearBit(int num, int i) {  
  2.         return num & ~( 1 << i );  
  3.     }  

 

 

 将num的最高位至第i位清零:

 

  1. boolean clearBitMSthrough(int num, int i) {  
  2.         int mask = ~( ( 1 << i ) - 1);  
  3. return num & mask;  
  4.  } 

将最右边的i位清零:

 

  1. boolean clearBitIthrough(int num, int i) {  
  2.         int mask = ~( ( 1 << ( i + 1 ) ) - 1 );  
  3.         return num & mask;  
  4.     }

代码实现:

注意:M和N的输入进制数

      [java] view plain copy

 

  1. public static void main(String[] args) {  
  2.     // TODO Auto-generated method stub    
  3.     String s1=Integer.toBinaryString(updateBits(1024, 19, 2, 6));  
  4.     System.out.println(s1);  
  5.       
  6.     String s2=Integer.toBinaryString(updateBits2(1024, 19, 2, 6));  
  7.     System.out.println(s2);  
  8. }  

 

两种方法:

方法一:

    [java] view plain copy

 

  1. public static int updateBits(int n,int m,int i,int j){        
  2.         int mask=~(1<<(j+1)-1);  
  3.         for(int k=i-1;k>=0;k--){  
  4.             mask+=1<<k;  
  5.         }  
  6.         int result=n&mask|(m<<i);  
  7.           
  8.         return result;    
  9.     }  

 

 

方法二: [java] view plain copy

 

  1. public static int updateBits2(int n,int m,int i,int j){  
  2.         int allOnes=~0;  
  3.         int left=allOnes<<(j+1);  
  4.         int right=(1<<i)-1;  
  5.           
  6.         int mask=left|right;  
  7.           
  8.         int n_cleared=n&mask;  
  9.         int m_shifted=m<<i;  
  10.           
  11.         return n_cleared|m_shifted;  
  12.     }

© 著作权归作者所有

共有 人打赏支持
一贱书生
粉丝 19
博文 724
码字总数 600123
作品 0
私信 提问
bzoj1070 [SCOI2007]修车

Description 同一时刻有 位车主带着他们的爱车来到了汽车维修中心。维修中心共有 位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。现在需要安排这 位技术人员所维修的车及...

aziint
2017/12/16
0
0
菜鸡吃米之位运算小结

bit 位运算的题目特点是不容易想到但如果有做过类似题目的话则能够很快给出方法。属于是见过就会没见过很难想到的思路。 下面尝试给出常见的一些问题和思路并使用python来完成。(其实python不...

跑得比谁都慢
2017/11/13
0
0
Counting Bloom Filter【ZZ】

Counting Bloom Filter 转载自:焦萌 2007年1月30日 【http://blog.csdn.net/jiaomeng】 从前面几篇对Bloom Filter的介绍可以看出,标准的Bloom Filter是一种很简单的数据结构,它只支持插入...

xtxb
2010/04/14
1K
0
BZOJ1070 / SCOI2007 修车【网络流/费用流】

Description 同一时刻有 位车主带着他们的爱车来到了汽车维修中心。维修中心共有 位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。现在需要安排这 位技术人员所维修的车及...

OwenOwl
2017/10/17
0
0
Python 基础练习 PAT水题(四)

#学习笔记 #用以练习python基础 # 原题链接:https://www.patest.cn/contests/pat-b-practise/1050 1050. 螺旋矩阵(25) 本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“...

chaunceyjiang
2017/04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。 一、...

王磊的博客
21分钟前
1
0
Ext grid 渲染

// 单元格字体颜色渲染function renderer_Meta_useStatus(value, cellmeta, record,rowIndex, columnIndex, store){ var color = ""; if("空闲"==value){ color = "green";......

MoksMo
30分钟前
4
0
log4j2在spring中的配置

<?xml version="1.0" encoding="UTF-8"?><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--Configuration后面的status,这个用于设置l......

TonyTaotao
36分钟前
3
0
java 中间变量缓存机制(i++,++i)

public class Test { public static void main(String[] args) { int i = 0; i = i ++ ; System.out.println(i); } } 答案是 0 如果是 i = ++......

shzwork
43分钟前
5
0
初识多线程及其原理-笔记

什么情况下应该使用多线程? 通过并行计算提高程序执行性能 需要等待网络、I/O响应导致耗费大量的执行时间, 可以采用异步线程的方式来减少阻塞 tomcat7 以前的io模型 客户端阻塞 线程级别阻...

Java搬砖工程师
54分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部