面试题5.1:给定两个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。

  输入:N=10000000000,M=10011,i=2,j=6,最后是第0位

  输出:N=10001001100

package cc150.bit;

public class UpdateBits {

	//面试题5.1:给定两个32位的整数N与M,以及表示比特位置的i与j。
//编写一个方法,将M插入N,使得M从N的第j位开始,到第i位结束
public static void main(String[] args) {
// TODO 自动生成的方法存根
UpdateBits ub = new UpdateBits();
System.out.println(ub.updateBits(1,1,2,4));
} public int updateBits(int n,int m,int i,int j){ //M插入N,i为右边第i位,j为右边第j位
int allOnes = ~0; //一串1 ,~0连符号位都是1
int left = allOnes << (j+1);
int right = (1 << i) -1;
int mask = left | right; //置零了从第i位到第j位
int n_clear = n & mask; //把n置零
int m_shifted = m << i; //把m左移动i位对其
//return Integer.toBinaryString(mask);
return n_clear | m_shifted; //返回合并后的值
} }

面试题5.2: 给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表示。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。

package cc150.bit;

public class BinDecimal {

	//面试题5.2: 给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表示。
public static void main(String[] args) {
// TODO 自动生成的方法存根
BinDecimal bd = new BinDecimal();
System.out.println(bd.printBin(0.625)); //0.5+0.125
} public String printBin(double num) {
// write code here
if(num >= 1 || num <= 0)
return "ERROR";
StringBuffer bf = new StringBuffer();
while(num > 0){
if(bf.length() >= 32)
return "ERROR";
double result = num * 2; //在循环中不断×2,如果大于1就减去1
if(result >=1){
bf.append(1);
num = result - 1;
}else{ //如果没有大于1,就把result赋值给num,继续×2
bf.append(0);
num = result;
}
}
return "0."+bf.toString();
}
}

面试题5.3:给定一个正整数,找出与其二进制表示中1的个数相同、且大小最接近的那两个数(一个略大,一个略小)。

package cc150.bit;

public class CloseNumber {

	public static void main(String[] args) {
// TODO 自动生成的方法存根
CloseNumber cn = new CloseNumber();
System.out.println(Integer.toBinaryString(cn.getPre(13948)));
System.out.println(Integer.toBinaryString(13948));
} public int[] getCloseNumber(int x) {
// write code here
int[] result = null;
int a = getPre(x);
int b = getNext(x);
if(a != -1 && b != -1){
result = new int[2];
result[0] = a;
result[1] = b;
return result;
}
else if(a != -1 && b == -1){
result = new int[1];
result[0] = a;
return result;
}
else if(a == -1 && b != -1){
result = new int[1];
result[0] = b;
return result;
}
return result;
} public int getNext(int n){
int c = n;
int c0 = 0; //计算最右边的1的位置,都是从0开始计数
int c1 = 0; //计算非尾部的最右边的0的位置,是去掉尾部的0之后的位置
while(((c & 1) == 0) && (c != 0)){ //当最后一位是1或者c等于0的时候停止
c0++;
c >>= 1; //右移并用1填充
} while((c & 1) == 1){ //因为上一步已经把最右边所有的零去掉,所以这里计算最右边的0的位置
c1++;
c >>= 1;
} if(c0 + c1 == 31 || c0 + c1 == 0)
return -1; int p = c0+c1; //计算非尾部的最右边的0的位置 n |= (1 << p); //把非尾部的最右边的0翻转成1,计算大于的那个值
n &= ~((1 << p) - 1); //将p右边的所有位清0
n |= (1 << (c1-1)) - 1; //在右边插入(c1-1)个1 return n;
} public int getPre(int n){
int temp = n;
int c0 = 0; //计算最右边1的位置,是去掉尾部的1之后的位置
int c1 = 0; //计算最右边0的位置
System.out.println("n="+Integer.toBinaryString(n)); while((temp & 1) == 1){ //计算最右边0的位置
c1++;
temp >>= 1;
}
System.out.println("c1="+Integer.toBinaryString(c1)); if(temp == 0)
return -1; while(((temp & 1) == 0) && (temp != 0)){//当最后一位是1或者c等于0的时候停止
c0++; //计算最右边1的位置,去掉了尾部的1之后的位置
temp >>= 1;
}
System.out.println("c0="+Integer.toBinaryString(c0)); int p = c0+c1; //计算最右边1的位置
n &= ((~0) << (p+1)); //将p右边的所有位清0(包括p),p是非尾部的最右边的1
System.out.println("清零后:"+Integer.toBinaryString(n)); int mask = (1 << (c1 + 1)) - 1; //c1+1个1,清零之后,需要补充c1+1个1
System.out.println("补充1的个数:"+Integer.toBinaryString(mask)); n |= (mask << (c0 - 1)); //需要补充的1多大能是多少,然后和清零后的合并
System.out.println("需要补充的1多大能是多少:"+Integer.toBinaryString(mask << (c0 - 1))); return (n);
} }

面试题5.4:解释代码  ((n&(n-1)) == 0) 的具体含义。

面试题5.5:编写一个函数,确定需要改变几个位,才能将整数A转成整数B。

package cc150.bit;

public class Transform {

	public static void main(String[] args) {
// TODO 自动生成的方法存根
Transform tf = new Transform();
System.out.println(tf.calcCost(2,1));
} public int calcCost(int A, int B) {
// write code here
int count = 0;
int c = A ^ B;
for(int i=c;i != 0;i=i >> 1)
count += i & 1;
return count;
} }

面试题5.6:编写程序,交换某个整数的奇数位和偶数位,使用指令越少越好(也就是说,位0与位1交换,位2与位3交换,依次类推)。

package cc150.bit;

public class Exchange {

	public static void main(String[] args) {
// TODO 自动生成的方法存根
Exchange ec = new Exchange();
System.out.println(ec.exchangeOddEven(2));
} public int exchangeOddEven(int x) {
// write code here
return ((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1); //0xaaaaaaaa是提取1010,0x55555555是提取0101
//1010右移,0101左移
} }

面试题5.7:数组A包含0到n的所有整数,但其中缺了一个。在这个问题中,只用一次操作无法取得数组A里某个整数的完整内容。此外,数组A的元素皆以二进制表示,唯一可用的访问操作是“从A[i]取出第j位数据”,该操作的时间复杂度为常数。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?

package cc150.bit;

public class Finder {

	public static void main(String[] args) {
// TODO 自动生成的方法存根
int[][] a = {{0},{1,0},{0,1},{0,0,1},{1,0,1}}; //少了1,1
Finder fd = new Finder();
System.out.println(fd.findMissing(a,5));
} public int findMissing(int[][] numbers, int n) {
// write code here
for(int i = 0; i < n; i ++) //注意数组的长度只有n-1
if(i % 2 != numbers[i][0]){ //按顺序必定是最后一位奇偶交替
return i;
}
return n;
} }

面试题5.8:有个单色屏幕存储在一个一维字节数组中,使得8个连续像素可以存放在一个字节里。屏幕宽度为w,且w可被8整除(即一个字节不会分布在两行上),屏幕高度可由数组长度及屏幕宽度推算出。请实现一个函数drawHorizontalLine(byte[] screen,int width,int x1,int x2,int y),绘制从点(x1,y)到点(x2,y)的水平线。

package cc150.bit;

public class Render {

	public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] a = {0,0,0,0,0,0};
Render rd = new Render();
for(int i=0;i<a.length;i++)
System.out.println(rd.renderPixel(a, 0, 47)[i]);
} public int[] renderPixel(int[] screen, int x, int y) {
// write code here
for(int i = x; i < y + 1; ++i){
screen[i / 8] |= 1 << (i % 8); //screen中一个元素代表8位,i%8求出每8位中哪一位是1,并左移到相应位置准备合并
}
return screen;
} }

面试题目——《CC150》位操作的更多相关文章

  1. C语言经典面试题目(转的,不过写的的确好!)

    第一部分:基本概念及其它问答题 1.关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一 ...

  2. HTML/CS3相关面试题目

    一.HTML/CS3基本面试题目. 1. 常用那几种浏览器测试? 1.1浏览器:IE,Chrome(谷歌),FireFox(火狐),Safari(苹果计算机的最新操作系统Mac OS X中的浏览器,使 ...

  3. PHP面试题目搜集

    搜集这些题目是想在学习PHP方面知识有更感性的认识,单纯看书的话会很容易看后就忘记. 曾经看过数据结构.设计模式.HTTP等方面的书籍,但是基本看完后就是看完了,没有然后了,随着时间的推移,也就渐渐忘 ...

  4. 总结CSS面试题目的考察点及常见布局问题整理

    整理网上流传的若干份面试题目,突发奇想,总结关于CSS面试题目的考察点,发现问题大多围绕几个属性和几种题目,水平有限,仅供参考. 写这个博文内心有种莫名奇妙的自我谴责感,实在不应该把面试层叠样式“应试 ...

  5. 【转】asp.net c# 网上搜集面试题目大全(附答案)

    asp.net c# 网上搜集面试题目大全(附答案) http://www.cnblogs.com/hndy/articles/2234188.html

  6. 2016年Web前端面试题目汇总

    转载: 2016年Web前端面试题目汇总 以下是收集一些面试中经常会遇到的经典面试题以及自己面试过程中未解决的问题,通过对知识的整理以及经验的总结,重新巩固自身的前端基础知识,如有错误或更好的答案,欢 ...

  7. 33条C#、.Net经典面试题目及答案

    33条C#..Net经典面试题目及答案[zt] 本文集中了多条常见的C#..Net经典面试题目例如".NET中类和结构的区别"."ASP.NET页面之间传递值的几种方式? ...

  8. 33条C#、.Net经典面试题目及答案[zt]

    33条C#..Net经典面试题目及答案[zt] 本文集中了多条常见的C#..Net经典面试题目例如“.NET中类和结构的区别”.“ASP.NET页面之间传递值的几种方式?”,并简明扼要的给出了答案,希 ...

  9. C/C++ 笔试、面试题目大汇总 转

    C/C++ 笔试.面试题目大汇总 这些东西有点烦,有点无聊.如果要去C++面试就看看吧.几年前网上搜索的.刚才看到,就整理一下,里面有些被我改了,感觉之前说的不对或不完善. 1.求下面函数的返回值( ...

  10. Android面试题目及其答案

    转自:http://blog.csdn.net/wwj_748/article/details/8868640 Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应 ...

随机推荐

  1. Hadoop Cluster 安装

    本篇源自Hadoop官网,先将中文翻译如下. 目标 本文章主要是描述如何安装和配置几个节点的Hadoop clusters,甚至于数以千计的节点数.为了了解详细的安装步骤,需要先了解如何安装在单台机器 ...

  2. SQL Server 2008 R2——TRUNCATE TABLE 无法截断表 该表正由 FOREIGN KEY 约束引用

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  3. jackson annotations注解详解

    jackson中常用到的注解 猛击下面的连接地址 http://blog.csdn.net/sdyy321/article/details/40298081

  4. 对 Visual Studio 中的Resharper禁用对某种文件的检测

    原因:在Visual Studio中安装Reshaper后,就会对各种文件进行代码检测,但是因为Reshaper更新的速度不是很及时,所以有时会对Visual Studio中某些新功能误断,导致Cod ...

  5. gdb脚本

    一.简介 作为UNIX/Linux下使用广泛的调试器,gdb不仅提供了丰富的命令,还引入了对脚本的支持:一种是对已存在的脚本语言支持,比如python,用户可以直接书写python脚本,由gdb调用p ...

  6. BI建模原则和常见问题

    BI建模的质量直接影响数据仓库项目的质量,所以在建模前,要对数据仓库的架构组成.大小以及模型功能有明确的定义. 影响BI数据仓库建模的因素众多,往往会随着项目的具体情况不同而变化.但有些原则是相通的, ...

  7. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  8. js中的hasOwnProperty和isPrototypeOf方法

    hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象.不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员. isPrototypeO ...

  9. oracle的decode函数在mysql的实现

    oracle中的decode函数很好用,换成mysql中可以用类似下面的方法实现: SELECT IF(TRUE, '真值', '假值'); 如果想再弄复杂点,可以多个IF嵌套,不过嵌套的层次多了,代 ...

  10. Qt——透明无边框Widget的bug

    Experience 最近在封装一些类的时候,打算做一个窗口框架,能实现拖动.缩放.最大最小化.基本样式等功能,可不慎遇见一件无比蛋疼的事情,QWidget最小化后再恢复正常界面,最小化按钮居然仍处于 ...