面试题-位操作

金融科技数据源 数字金融开放研究平台 阅读详情

 

如何准备:

Bit manipulation can be a scary thing to many candidates, but it doesn’t need to be! If you’re shaky on bit manipulation, we recommend doing a couple of arithmetic-like problems to boost your skills Compute the following by hand: 1010 - 0001 1010 + 0110 1100^1010 1010 << 1 1001^1001 1001 & 1100 1010 >> 1 0xFF - 1 0xAB + 0x11 If you’re still uncomfortable, examine very carefully what happens when you do subtraction, addition, etc in base 10 Can you repeat that work in base 2?

很多应聘者都很害怕“位操作”的题目,害怕确实是没有必要的。如果真的在位操作方面不太擅长的话,建议你还是通过在一些练习好好准备。笔算下面的题目:

如果这些题目做的时候还有困惑的话,那就把我们平时做10进制加减的规则联系到2进制上。

NOTE: The Windows Calculator knows how to do lots of operations in binary, including ADD, SUBTRACT, AND and OR. Go to View Programmer to get into binary mode while you practice.

注意:windows自带的计算器能完成很多2进制下的计算,加减法,求与求门等。点击计算机的“查看” -> “科学型”,再按F7就能进入二进制模式计算了。

Things to Watch Out For:

注意事项:

» It’s really easy to make mistakes on these problems, so be careful! When you’re writing code, stop and think about what you’re writing every couple of lines - or, better yet, test your code mid-way through! When you’re done, check through your entire code » If you’re bit shifting, what happens when the digits get shifted off the end? Make sure to think about this case to ensure that you’re handling it correctly And (&): 0 & 0 = 0 1 & 0 = 0 0 & 1 = 0 1 & 1 = 1 Or (|): 0 | 0 = 0 1 | 0 = 1 0 | 1 = 1 1 | 1 = 1 Xor (^): 0 ^ 0 = 0 1 ^ 0 = 1 0 ^ 1 = 1 1 ^ 1 = 0

*在写代码的时候涉及到位操作一定要小心。边写的时候就要边想下,最好还能测试下。最后全部写完以后再测试一次。
*在做移位操作的时候,特别注意移位超过边界的时候如何处理。一定要想清楚然后。

Left Shift:

左位移:

x << y means x shifted y bits to the left If you start shifting and you run out of space, the bits just “drop off” For example: 00011001 << 2 = 01100100 00011001 << 4 = 10010000

x< < 表示将x向左位移y位。移动时超出的部分直接丢弃。

Right Shift:

右位移:

x >> y means x shifted y bits to the right If you start shifting and you run out of space, the bits just “drop off” the end Example: 00011001 >> 2 = 00000110 00011001 >> 4 = 00000001

x>>y 表示将x向右位移y位。移动时超出的部分直接丢弃。

5 1 You are 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) EXAMPLE: Input: N = 10000000000, M = 10101, i = 2, j = 6 Output: N = 10001010100

5.1 给你两个32位整数N,M,还有表示位置的i和j。实现方法使得N的i至j位等于M。例如:输入  N = 10000000000, M = 10101, i = 2, j = 6 输出 N = 10001010100
5.1解答:
解法很简单,首先将N的i到j位清零,然后再将M左移i位,最后将两数做或。

5 2 Given a (decimal - e g 3 72) number that is passed in as a string, print the binary rep- resentation If the number can not be represented accurately in binary, print “ERROR”

5.2 以字符串形式传入一个十进制数(例如3.72),输出它的二进制表示形式。如果不能准确表示则输出"ERROR"
5.2解答:首先我们思考一下小数是如何用二进制表示的。以n = 0.101 = 1 * (1/2^1) + 0 * (1/2^2) + 1 * (1/2^3)为例。
打印输出整数部分是非常简单和直接的。小数部分我则采用将n*2,取整数部分,这就相当于“移位”的思想。

如果r>1,那么说明小数点后第一位为1。一直这样做,我们就能得到小数的二进制表示方法。

(译者注:本题作者理解为若32位小数仍无法表示则认为该数无法用二进制准确表示。更为准确的是判断标准为:在转换的任意阶段,若小数部分的最后一个数字非5,在该数无法被二进制数准确表示。)

5 3 Given an integer, print the next smallest and next largest number that have the same number of 1 bits in their binary representation

5.3 给定一个整数,输出与这整数在二进制表示下有相同个数“1",大于n的最小值和小于n的最大值。
5.3解答:
暴力算法:
最简单的方法就是从n向上/向下例举,判断是否有对应个数的”1“。但是这样的方法一点技术含量也没有。
根据数字性质:
首先观察
* 若降一个”1“变为”0“,再另一个”0“必须变为1;
* 若将第i位的0变为了1,第j为的1变为了0,那么数字大小的变化为2^i - 2^j;
* 若要变大数字必须让i大于j。
求大于n的最小值:
* 将n转化为二进制,从右往左依次遍历各位,在经过1后,遇到的第一个0,将其置1。这样就是个数字增大了2^i。例:xxxxx011100 变成 xxxxx111100
* 将i位右边的1置0,这样数字总的变化2^i-2^(i-1)。例:xxxxx111100 变成 xxxxx101100
* 为了让大于n的最小值,将i-1之后的1都移到最右端。
求小于n的最大值,方法类似:
* 将n转化为二进制,从右往左一次遍历各位,在经过0后遇到的第一个。例如xxxxx100011 变为 xxxxx000011
* 将i位右边的0置为1。例如xxxxx000011 变为 xxxxx010011。
* 为求最大值,将i-1位后的1尽量往左移到。
有了算法,开始着手写代码的时候记得将一些常用的方法放到一个公共的类中,写出整洁的代码。

5 4 Explain what the following code does: ((n & (n-1)) == 0)

5.4 解释下面表达式的含义 ((n & (n-1)) == 0)
5.4解答
我们来反向思考这个问题。
A&B=0是什么意思呢?它表示A和B两个数的二进制数每一位都不相同。那么n & (n-1)=0,说明n和n-1也没有相同的位。
那n-1又表示什么意义呢?从下面的例子你能看发现什么呢?

当你做减法的时候,主要看最低位,如果最低位为1,那么最低位直接变0;如果最低位为零,那么向高位借1,再减。从低位开始向高位将0变为1,直到借位的那一位。那么n和n-1的关系将会如下例所示:

如果n&(n-1)为0的话,说明例子中的abcde均为0,也就是说n中只有一位为1。也就是说n为2的整数次幂。

5 5 Write a function to determine the number of bits required to convert integer A to integer B Input: 31, 14 Output: 2

5.5 实现函数计算将整数从A变成B需要变动几位。例如 输入:31,14 输出 2
5.5解答:
本题的解题关键在于发现A和B之间有多少位是不同的。那如何判断A和B那些位不同呢?对XOR!
将获得A和B不同的部分,统计出有多少个1就能判断需要变动几位了。

5 6 Write a program to swap odd and even bits in an integer with as few instructions as possible (e g , bit 0 and bit 1 are swapped, bit 2 and bit 3 are swapped, etc)

5.6 实现方法将一个整数中的偶数位和奇数位交换。(例如:将0位和1位交换,2位和3位交换)
5.6解答:
用10101010(0xAA)这样的掩码提取出偶数位的信息,类似的用0x55提取奇数位的信息。然后错位求或即可。

5 7 An array A[1 n] contains all the integers from 0 to n except for one number which is missing In this problem, we cannot access an entire integer in A with a single operation The elements of A are represented in binary, and the only operation we can use to access them is “fetch the jth bit of A[i]”, which takes constant time Write code to find the missing integer Can you do it in O(n) time?

5.7 一个数组A[1,n]能容纳n个数字,现将0到n这n+1个数字,随机的放入到数组中。最后会有一个数字没有进入数组。现在让你找出这个数字。但是有如下的限制,不能直接访问数组的整个元素,只能访问“A[i]的第j位”。写出代码找出该元素。能否将时间复杂度控制在O(n)。
5.7解答:
(译者注:作者这里假设n为奇数。)
首先我们将0到n的所有数字的二进制表达列出来。那么我们可以发现最低位的,大概是这样的情况:count(0)>=count(1)。
如果我们从中移除了一个数字,会怎么样呢?

如果移除的数最低位为0,那么count(1)>=count(0);如果移除的是1,那么count(0)>count(1)。如果n次访问每个数的最低位,那么用以上的准则我们就能判断出没有进入数组的那个数字的最后一位是什么。如果最低位是0的话,那就可以排除最低位为1的元素;如最低位为1,那就可以排除末尾为0的。
那下一步怎么办呢?看次低位的情况?那么我以n=5,未入数组的数字为3。经过上一轮的排除后,剩下的数字如图所示:

那么现在次低位的情况为0 0 1 0 1 0 ,根据之前的逻辑我们知道,次低位应该是1。那么我们继续排除。只保留末尾为11的元素。剩下的就是:

再继续看倒数第三位。同样方法知道第三位应该是0。那么我们确定出了丢失的元素。
根据以上的方法,确定实现代码如下:

那算法的时间复杂是多少呢?第一次扫描了N次的最低位,第二次为N/2......以此类推,根据下式子:

所以我的算法的复杂度为O(n)。

SonarQube 完整手册(2026 最新) 摘要: SonarQube是一款静态代码分析(SAST)平台,支持20+语言(如Java/Go/Python),提供Bug、漏洞、代码异味等检测,集成DevOps流水线。其架构包含服务端、扫描器和SonarLint插件。2026年四大版本:免费社区版(基础功能)、开发者版(多分支/PR分析)、企业版(合规治理)、数据中心版(高可用集群)。核心功能包括质量门禁(QualityGate)、密钥泄露检测及六大质量指标。部署推荐Docker+PostgreSQL,扫描支持Maven/CLI方式。 阅读详情

相关推荐

Chronos时间序列预测实战:从零开始微调你的第一个大语言模型(附完整代码)

本文提供了一份详细的Chronos时间序列预测大语言模型微调实战指南。从环境搭建、数据预处理到模型配置与训练,手把手教你如何利用自己的数据微调Chronos模型,并完成评估与部署,助你快速掌握这一前沿技术。

zzz56的博客 300

java位运算笔试题_盘点:这 7 道位运算面试题,哪一题你能做对?

原标题:盘点:这 7 道位运算面试题,哪一题你能做对?设为“置顶或星标”,第一时间送达干货。转自小浩算法 以下是目录,列出的全部内容都应该进行掌握:位运算基础位运算的奇淫技巧两数之和二的幂一的个数只出现一次的数字Ⅰ只出现一次的数字Ⅱ01PART位运算基础 程序中的所有数在计算机内存中都是以二进制的形式储存的,位运算就是直接对整数在内存中的二进制位进行操作。首先我们还是简单列下常规的位运算: 基本常...

weixin_42370927的博客 493

避坑指南:Zephyr RTOS与nRF Connect SDK环境搭建常见错误及解决方案

本文详细解析了Zephyr RTOS与nRF Connect SDK环境搭建过程中的常见错误及解决方案,涵盖网络问题、代理设置、SEGGER Embedded Studio配置、分支切换等关键环节。针对开发者实际遇到的痛点问题,提供了一系列实用技巧和深度排错方法,帮助高效完成NCS开发环境部署。

weixin_28685287的博客 168

程序员面试题汇总之位操作

4.1如何实现位操作求两个数的平均值? 一般而言,两者的平均值位(x+y)/2。采用这种方法,当两个数比较大时,可能会存在数据溢出的情况,采用位运算可以避免这个问题。 (x&y)+((x^y)>>1)方式表达的就是求解x与y的平均数,而且位运算相比除法运算,效率更高。 x&y表示的是去取出x和y二进制中都为“1”的所有位,x^y表示的是x与y中有一个位“1”的所有位,右...

weixin_42388255的博客 268

WINCC8.1工业组态软件安装与授权配置指南

SCADA系统作为工业自动化控制的核心平台,通过实时数据采集与监控实现生产流程可视化。WINCC作为西门子旗舰级组态软件,其8.1版本凭借稳定的运行时环境在汽车制造、流程工业等领域广泛应用。本文从工业控制系统软件安装规范切入,重点解析WINCC8.1与Automation License Manager的协同工作原理,详细说明包括系统环境检查、安装包校验、授权文件配置等关键技术环节。针对工程实施中常见的内存配置不足、授权管理器报错等典型问题,提供经过现场验证的解决方案,特别适用于需要进行产线监控系统升级维护

cqwf95925的博客 1651

PCL 提取两片点云的非重叠部分【2025最新版】

PCL 提取两片点云的非重叠部分。博客长期更新,本文最近一次更新时间为:2025年9月1日。

点云侠的博客 36万+

向量叉乘

向量的叉乘如X叉乘Y就是一个垂直于X和Y组成的平面的一个向量,方向是这样决定的,右手四指与X的方向相同,大拇指与四指垂直,然后四指按照这样的方向绕,从X开始,经过X与Y的锐角的方向环绕,拇指所指的方向就是X叉乘Y的方向 link:http://zhidao.baidu.com/question/16584042.html

只有偏执狂才能生存 3853

基于STM32LXXX的模数转换芯片ADC(CMS24AD2001)驱动C程序设计

/ 电压 = (原始值 / 2^23) * Vref (注意:24位有符号数范围为 -2^23 到 2^23-1)//---------------- 硬件端口映射 (请根据实际电路修改) ----------------ADC_SCLK_HIGH();- PGA 放大倍数可选:1、2、4、8、16、32、64、128、256;//---------------- 宏定义操作 -------------------//---------------- 函数声明 -------------------

myron6688的博客 160

位运算面试题常用技巧

位操作是面试中的常见考题一种,位操作有~, <<, >>, &, |, ^六种。左移和右移对于左移正数和负数是相同的;对于右移,正数补0,负数补1. 例如 对于一个16位的整数:0000 0000 0000 0101,左移一位是0000 0000 0000 1010,右移一位是0000 0000 0000 0010 对于一个16位的负数:1000 0000 0000 0101,左移一位是000

oscarwin 7741

淘宝母婴用品数据挖掘及可视化分析研究

1. 背景介绍 在当今的电子商务时代,母婴用品市场已经成为了各大电商平台的一片蓝海。淘宝作为中国最大的电子商务平台,其上的母婴用品交易数据自然引人关注。理解这些数据,可以帮助商家更好地制定营销策略,也可以帮助消费者更好地选择产品。因此,本文将对淘宝母婴用品的数据进行深入的挖掘和分析。 1.1 电子商务的

AI天才研究院 1255

运动控制软件:Siemens Sinamics二次开发_(6).通信接口与协议详解

PROFIBUSPROFINETModbus TCPCANopenEtherCAT每种通信接口都有其特定的应用场景和优势。选择合适的通信接口可以显著提高系统的性能和可靠性。在选择通信协议时,需要根据具体的应用场景和需求综合考虑。每种通信协议都有其特定的优势和局限性,因此在设计运动控制系统时,应选择最适合的协议,以确保系统的性能、可靠性、成本和维护性。通过以上对比和分析,希望开发者能够更好地理解和选择适合的通信接口和协议,从而优化运动控制系统的开发和应用。

2401_87715305的博客 898

位操作以及与位操作有关的面试题

前提: (1)计算机中数据是按照补码存储 (2)位运算只针对整型或字符型数据,如char, short, int, long, unsigned 存储: (1)在各种语言中,没有专门存储位的存储结构,常使用字符、整形数据存 (2)执行位操作时,应该针对整个存储结构单元操作 各种操作: 与操作 规则:全1为1 用途 (1)清零:欲对一个字节清零,通常是“与”上

思考,思考,再思考~ 2558

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

华为位操作面试题分析

今天看到一题关于位操作的面试题,看了所谓的答案后还是比较迷茫,于是网上搜索了下,加上自己理解整理如下 题目: Normal 0 7.8 磅 0 2 false false false

yijing21的专栏 716

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【IT笔试面试题整理】位操作

如何准备: Bit manipulation can be a scary thing to many candidates, but it doesn’t need to be! If you’re shaky on bit manipulation, we recommend doing a couple of arithmetic-like problem...

weixin_30782331的博客 112

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

大厂高频经典面试题-《位操作合集》

大厂高频经典面试题-《位操作合集》,让你彻底掌握位操作的常用算法和场景应用。

1009

两个常见位操作面试题 不用加减乘除运算符计算两数之和及a b 3

两个常见位操作面试题 不用加减乘除运算符计算两数之和及a b 3

ffygvf的博客 153

面试题--位操作

如何准备: Bit manipulation can be a scary thing to many candidates, but it doesn’t need to be! If you’re shaky on bit manipulation, we recommend doing a couple of arithmetic-like problems to boost your s...

weixin_30516243的博客 71

C语言 两道位操作的面试题

1、把一个32位的数按位反转,就是第32位转到第1位,第31位转到第2位………… 什么样的算法最节省效率? 参考http://www.yuanma.org/data/2007/0723/article_2763.htm unsignedint bit_reverse(unsignedint n) {        n =((n >> 1)& 0x55555555)|((n

fay8048的博客 2153

C/C++面试题-位操作1

    这几天做了一些C/C++企业面试题,今天开始整理了一些编程题目,希望有更好想法的朋友多多指点,我们互相学习。    有一道题目描述是这样的:unsigned int intvert(unsigned int x,int p,int n)实现对 x 的进行转换,p 为起始转化位,n 为需要转换的长度,假设起始点在右边.如 x=0b0001 0001,p=4,n=3转换后 x=0b0110 0...

lianyumook2010的专栏 563

C语言之简单的位操作面试题

不得不说位操作确实是一个十分不错的操作,只是简单的几步就足以笑傲江湖,今天看两道简单位操作面试题二进制中1的个数:实现一个函数,输入一个整数,输出该整数二进制中1的个数分析:这还不简单,直接让这个整数依次往右边移动一位,与1做与运算&,然后统计1的个数,等等,有诈,万一是负数的话,这不就成死循环了吗,思考片刻,简单,这次就让1不断的往左边移动,然后去与整数做与运算&,这也是可以的。。。再等等,万一这

摩尔的博客 1264

用位操作符.解决经典面试题

先a = a ^ b,在b = a ^ b (b=a(a^b)^b→b=a),然后a = a ^ b (a=a(a^b)^b(a)→a=b)。先求和a = a + b,在b = a - b (b=a(a+b)-b→b=a),在a = a - b (a=a(a+b)-b(a)→a=b)。例:(101)^(100)=(001)。例:(101)|(100)=(101)。(例:a = 1,b = 2→a = 2,b = 1)。例:(101)&(100)=(100)。(例:a = 1,b = 2→c = 3)。

2301_80662872的博客 408

面试题:位操作

1、求两个数的平均值 分析: 1、当然可以用(a+b)/2,但是若a和b值太大,难免a+b越界 2、如果打开用a/2+b/2,但是在int中如果a,b都是奇数的话,那么结果就会比原来的值小1 3、考虑我们笔算加法时的情况,如果算a+b,如果不考虑进位情况即是a^b,各个位的前一位向后一位的进位是:(a&b),最后除以2即右移1位,所以位操作求平均值有(a&b)+((a^b)>>1) #i

王川的私房菜 1042

C语言面试题_位操作

位结构面试题 2006-2-27 星期一(Monday) 晴 #include<stdio.h>union{struct{unsignedshorts1:3;unsignedshorts2:3;unsignedshorts3:3;}x;...

weixin_34125592的博客 181

两道关于位操作的面试题

最近看到两道面试题,用到了同一个为操作公式:XXXX1000&(XXXX1000-1)=XXXX0000。 1.输入一个数字判定该数字是否是2^N类型。 #include using namespace std; bool func1(int a); int main() { int ary[5]={9,16,57,256,1024}; for (int i=0;i<5;i+

sicofield的专栏 1619

Java面试题链表、树和位操作

最近金九银十刚刚过去,可谓是有人欢喜有人愁,不过,今天的任务是跑不掉的,走到最后的才是胜利者,下面记录几个面试题链表之快慢法实现一个算法,找出单向链表中倒数第k个节点 太直观的解法我们就不去考虑了,我们考虑一下迭代法吧,使用两个指针P1和P2,将它们指向链表中相距K个结点的两个节点,具体做法是先将P1 和P2 指向链表首结点,然后将P2向前移动K个节点,然后以相同的速度移动这两个指针,P2 会在

摩尔的博客 822
上一篇: 面试题集-堆栈和队列
下一篇: 2012.09.10阿里笔试,12面试
coder_xia
博客等级 码龄17年 151粉丝 143原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值