公司法
当前位置: 首页 法律大全

位运算的实际意义(常见的位运算)

时间:2023-07-04 作者: 小编 阅读量: 1 栏目名: 法律大全

位操作是各大互联网公司面试经常会问的一类问题。

计算机中的数在内存中都是以二进制形式进行存储的,用位操作就是直接对整数在内存中的二进制位进行操作,因此其执行效率非常高,在程序中尽量使用位运算进行操作,这会大大提高程序的性能。位操作是各大互联网公司面试经常会问的一类问题。

位操作符

& 与运算 两个位都是 1 时,结果才为 1,否则为 0,如:

| 或运算 两个位都是 0 时,结果才为 0,否则为 1,如:

^ 异或运算,两个位相同则为 0,不同则为 1,如:

~ 取反运算,0 则变为 1,1 则变为 0,如:

<< 左移运算,向左进行移位操作,高位丢弃,低位补 0,如:

>> 右移运算,向右进行移位操作,对无符号数,高位补 0,对于有符号数,高位补符号位,如:

常见位运算问题

1. 位操作实现乘除法

数 a 向右移一位,相当于将 a 除以 2;数 a 向左移一位,相当于将 a 乘以 2


2. 位操作交货两数

位操作交换两数可以不需要第三个临时变量,虽然普通操作也可以做到,但是没有其效率高

位与操作解释:

  • 第一步:a ^= b ---> a = (a^b);
  • 第二步:b ^= a ---> b = b^(a^b) ---> b = (b^b)^a = a
  • 第三步:a ^= b ---> a = (a^b)^a = (a^a)^b = b

3. 位操作判断奇偶数

只要根据数的最后一位是 0 还是 1 来决定即可,为 0 就是偶数,为 1 就是奇数。


4. 位操作交换符号

交换符号将正数变成负数,负数变成正数

整数取反加 1,正好变成其对应的负数(补码表示);负数取反加一,则变为其原码,即正数。


5. 位操作求绝对值

整数的绝对值是其本身,负数的绝对值正好可以对其进行取反加一求得,即我们首先判断其符号位(整数右移 31 位得到 0,负数右移 31 位得到 -1,即 0xffffffff),然后根据符号进行相应的操作

上面的操作可以进行优化,可以将 i == 0 的条件判断语句去掉。我们都知道符号位i只有两种情况,即 i = 0 为正,i = -1为负。对于任何数与 0 异或都会保持不变,与 -1 即 0xffffffff 进行异或就相当于对此数进行取反,因此可以将上面三目元算符转换为 ((a^i)-i),即整数时 a 与 0 异或得到本身,再减去 0,负数时与 0xffffffff 异或将 a 进行取反,然后在加上 1,即减去 i(i =-1)


6. 位操作进行高低位交换

给定一个 16 位的无符号整数,将其高 8 位与低 8 位进行交换,求出交换后的值,如:

从上面移位操作我们可以知道,只要将无符号数 a >> 8 即可得到其高 8 位移到低 8 位,高位补 0;将 a << 8 即可将 低 8 位移到高 8 位,低 8 位补 0,然后将 a >> 8 和 a << 8 进行或操作既可求得交换后的结果。


7. 位操作进行二进制逆序

将无符号数的二进制表示进行逆序,求取逆序后的结果,如:

在字符串逆序过程中,可以从字符串的首尾开始,依次交换两端的数据。在二进制中使用位的高低位交换会更方便进行处理,这里我们分组进行多步处理。

  • 第一步:以每 2 位为一组,组内进行高低位交换
  • 第二步:在上面的基础上,以每 4 位为 1 组,组内高低位进行交换
  • 第三步:以每 8 位为一组,组内高低位进行交换
  • 第四步:以每 16 位为一组,组内高低位进行交换

对于上面的第一步,依次以 2 位作为一组,再进行组内高低位交换,这样处理起来比较繁琐,下面介绍另外一种方法进行处理。先分别取原数 10000110 11011000 的奇数位和偶数位,将空余位用 0 填充:

再将奇数位右移一位,偶数位左移一位,此时将两个数据相或即可以达到奇偶位上数据交换的效果:

上面的方法用位操作可以表示为:

  • 取 a 的奇数位并用 0 进行填充可以表示为:a & 0xAAAA
  • 取 a 的偶数为并用 0 进行填充可以表示为: a & 0x5555 因此,上面的第一步可以表示为:
  • a = ((a & 0xAAAA) >> 1) | ((a & 0x5555) << 1)
  • 同理,可以得到其第二、三和四步为:
  • a = ((a & 0xCCCC) >> 2) | ((a & 0x3333) << 2)
  • a = ((a & 0xF0F0) >> 4) | ((a & 0x0F0F) << 4)
  • a = ((a & 0xFF00) >> 8) | ((a & 0x00FF) << 8)
  • 因此整个操作为:

8. 位操作统计二进制中 1 的个数

统计二进制 1 的个数可以分别获取每个二进制位数,然后再统计其 1 的个数,此方法效率比较低。这里介绍另外一种高效的方法,同样以 34520 为例,我们计算其 a &= (a-1) 的结果:

  • 第一次:计算前:1000 0110 1101 1000 计算后:1000 0110 1101 0000
  • 第二次:计算前:1000 0110 1101 0000 计算后:1000 0110 1100 0000
  • 第二次:计算前:1000 0110 1100 0000 计算后:1000 0110 1000 0000 我们发现,每计算一次二进制中就少了一个 1,则我们可以通过下面方法去统计:
,
    推荐阅读
  • 怎样烧红烧肉(家常红烧肉的做法)

    怎样烧红烧肉原料:精品五花肉、炖肉料包、葱、冰糖、茶叶。五花肉切条放入凉水中撇去血沫。焯水定型;捞出后晾凉切一样大的方块。锅中放少许油倒入白砂糖炒糖色。糖色的气泡由大变小迅速关火,倒入开水。加少许绍酒,加开水烧,熟得快,加入茶叶水,可以去腥味。改回炒锅大火,放冰糖,使汁粘稠即可出锅,香葱段点缀。

  • 2022杭州径山茶圣节时间、地点、活动一览

    最终集齐所有铜币的游客可至“大宋钱庄”兑换神秘礼物。今来茶韵生活01、陆羽说论坛为进一步挖掘径山茶宴有关历史文化,本届茶圣节特邀请茶学专家交流讨论如何更好保护和传承国家非物质文化遗产。为打造文化传播年,第二十一届中国茶圣节以春迎、夏凉、秋韵、冬福四大主题贯穿全年。

  • 《重生之门》给罗队发短信的人身份

    但是通过前文,不难推测应该是庄文杰发给罗队的短信,只是没有暴露自己的身份。罗坚来到青檀假日酒店排查,没有发现任何异常,庄文杰和许正清乔装改扮随后赶来,他们一出现就被人盯上,庄文杰和许正清来到地下停车场,庄文杰巧妙引开那些人,混进游客中进入酒店。这件事情把十二年前的洛神案串联起来了。

  • 爱情名著哪个好看(随侃名著佳作第6期)

    言下之意,他主动向周晓白提出分手。钟跃民成为一个军人,上了战场,并且是在战斗中受伤,被送到战地医疗帐篷内救治。而周晓白和钟跃民在时隔十多年后的相遇一刻,也是被编剧以及导演,安排得相当的特别,并不是那种悲情欲绝又或者是感动无比的相遇时刻。

  • 板栗可以保存多久 板栗怎么能保存时间长

    如果是晒干的板栗可以存放3-4个月,生板栗在常温下合理贮存可以存放1-2个月,煮熟的栗子大概可以放一周,熟板栗放冰箱冷冻能保存30天左右,熟板栗放冰箱冷藏保存可以存放5天。

  • 贾宝玉与红楼梦的关系(贾宝玉的春梦到底在暗示什么)

    贾宝玉与红楼梦的关系?要知道,贾琏这个人极其好色,而且好的就是熟女,那么从这个曲折的描述中,我们可以推断出,秦可卿应该是那种熟女中的极品。这个问题在书中得不到直接的答案,因为在后面的文章中,秦可卿一共只出现三个镜头:介绍弟弟秦钟与贾宝玉相见,秦可卿病后王熙凤带贾宝玉去探病,秦可卿临死前在梦里向王熙凤交代后事。

  • 简单又好看的剪纸适合儿童(孩子能学会的幼儿简单剪纸教程)

    接下来我们就一起去研究一下吧!简单又好看的剪纸适合儿童幼儿园的孩子经常要做各种各样的手工,通过做手工,提高孩子的审美能力,锻炼孩子的动手能力,培养孩子的专注力和耐心,让孩子更聪明。用蓝天白云绿色的草地,太阳、小兔子和小蘑菇,可以贴出一幅画,也可以用这个画面编出一个小故事,带孩子度过愉快的亲子时光。欢迎关注,学习更多幼儿小手工。

  • 摩尔庄园钓鲤鱼的最佳方法(摩尔庄园钓鲤鱼的有什么最佳方法)

    以下内容希望对你有帮助!摩尔庄园钓鲤鱼的最佳方法工具/原料:华为手机、安卓系统、摩尔庄园游戏。进入游戏后操纵游戏角色进行移动了。去商店购买钓鱼的诱饵。来到池塘边进行的钓鱼。等待的水面出现波动即可钓到鲤鱼了。

  • 国外的懒人产品(歪国产品咖在用哪些可爱的小工具)

    quotes=trueUsabilityHub我通常使用UsabilityHub来帮助确定设计方案。

  • 一年四季水果时间表(一年四季的时令水果是什么)

    3月(春季):枇杷、红香蕉、樱桃、杨桃、番荔枝、青枣、甘果蔗、草莓、番石榴、牛奶蕉、柑桔、观赏南瓜、果桑、鹤首瓜。12月(冬季):樱桃、番茄、红香蕉、鸡蛋果、木瓜、草莓、百香果、杨桃、无花果、番石榴、牛奶蕉、鹤首瓜、观赏南瓜、果蔗、台湾青枣、黑提子、人心果、柠檬、菠萝、油梨、柑橘、橙子。