位运算相关题目

面试中会遇到很多与位运算相关的题目,在这里对位运算的相关知识点和遇到的一些题目总结一下。

二进制的5种位运算:

与(&) 

或(|) 

异或(^)

左移(<<) : m<<n表示 把m左移n位,最左边的n位会被丢弃,同时最右边补上n个0;

右移(>>):m>>n表示 把m右移n位 最右边的n为会被丢弃,如果数值原来是个正数,用0补上最左边的n位,如果是一个负数,则最左边补上n个1;

题型一:进制转换

微软产品Excel中,用A表示第1列,B表示第2列……z表示第26列,AA表示第27列,AB表示第28列……以此类推。请写出一个函数,输入字母表示的列号编码,输出它是第几列。

本质上是把十进制数字用A-Z表示成二十六进制。

题型二:二进制中1的个数

题目描述:实现一个函数,输入一个整数,输出这个数字二进制中表示1的个数。如,把9表示成二进制是1001,有2个1。因此输入9,函数输出为2。

一种典型的想法是,利用循环,每次将数字n与1做位与(&)运算,检验最优以为是不是1,然后将数字n右移一位,循环终止条件为n为0;

这种思想的问题在于,如果n为负数,在右移操作时,最左边将会用1填充,则会陷入死循环中。

另外,不要使用除法来代替位运算,虽然右移一位与除以2效果等价,但是除法效率比移位运算低很多。

换一种思路避免死循环:

每次把数字n与1进行位与运算,判断n的最低位是不是1,,然后1左移一位,再和n位与,判断n的次低位是不是1;

这样的想法,循环的次数是整数二进制的位数;循环的次数有点儿多啊;

改进一下,n中有几个1就循环几次的算法:

一个规律,一个整数减去1,再与原整数做与运算,即: n &(n-1) 会将该整数的从右边数第一个1变成0,这样该整数中有几个1就循环几次,直至把该整数中的1都变成0;

 

题型三:一条语句判断一个整数是不是2的整数次方

利用上一个题中最后的思路,因为分析可知,如果一个整数是2的整数次方,则其二进制表示中,有且仅有一个1,所以,只要利用 n&(n-1) 判断其值是否为0即可;

题型四:一个数字改变几位得到另一个数字:

题目描述:输入两个整数m和n,计算需要改变m的二进制中的多少位能得到n。比如10的二进制表示为1010,13的二进制位1101,需要改变3位。

 

解决该问题可以分为两步,首先m和n进行异或,然后统计异或的结果中有多少个1,,方法见题型二

题型五:数组中数字出现的次数

题目一:数组中只出现一次的一个数字

一个整型数组中,除了一个数字外,其他数字都出现了两次,请写出程序找出这一个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1)

利用异或运算的一个性质,即与自身相异或,结果都为0。所以从头到尾依次异或数组中的每个数字,最终的结果刚好是那个只出现一个的数字。

题目二:数组中只出现一次的两个数字

一个整型数组中,除了两个数字外,其他数字都出现了两次,请写出程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1)

如果像上一题一样,所有的数字一次异或,得到的结果是两个出现一次的数字相异或的结果。根据这个结果,找出该数字从右数第一个1,根据这一位是1还是0,将原数组中的数字分为两组,两组中各包含了一个只出现一次的数字。然后利用上一题的思路,分别异或,就能把只出现一次的两个数字找出来。

题目三:数组中唯一只出现一次的数字

在一个数组中,除了一个数字只出现一个外,其余数字都出现了三次,请找出这个只出现一次的数字。

思路是,出现三次的数字,则该数字二进制表示中,某一位1则出现了三次,所以统计二进制表示中每一位的和,如果是3的倍数,则说明只出现一次的数字该位是0,否则该位是1;

 

题型六 不用加减乘除做加法

题型七 不用新的变量,交换两个变量的值

基于异或运算

a=a^b;

b=a^b;

a=a^b;

基于加减法:

a=a+b;

b=a-b;

a=a-b;

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值