位运算的运用1

一、位运算的前导知识

           1.位运算符:&(与),|(或),^(异或),~(非/取反),<<(左移),>>(右移),>>>(无符号右移,高位填0)

                     

           2.关于异或(^)

                 (1)异或满足交换律和结合律

                 (2)对于任何数,都有x^x=0,x^0=x,同自己求异或为0,同0求异或为自己  

           3.在Java中,对于int型的数,比如,1<<35和1<<3的结果都是一样的,都是8,因为Java会这样处理它,先将35%32=3,然后再进行左移的操作     

           4.位运算的操作都是针对补码进行的操作              


二、位运算在某些题目中的应用

           1.用来判断奇偶数

                    思路:假设某个数x(这里的例子不妨都以int型数据为例),我们可以让x与1做运算(1的补码是:00000000 00000000 00000000 00000001,因为正数的补码就是原码本身),至于x是什么我们并不关心,我们关心的是x与1进行&运算后的结果,如果结果是1,那么x是奇数,如果结果是0,那么x是偶数(原因:因为对于所有的整数,如果此数是偶数,那么最低位必然为0,如果此数是奇数,那么最低位必然是1(二进制的表示规则就是这样的))。

                    例子:假设我们需要判断-7和8的奇偶性

                          当x= -7的情况下,-7的原码是 10000000 00000000 00000000 00000111,那么-7的补码就是除符号外取反+1,即 11111111 11111111 11111111 11111001 ,那么就是将-7的补码这个数和1进行&(与)运算有:  

由此观察,可知,最终的结果是1,所以该数是奇数

                          

                         当x=8的情况下,8的原码是 00000000 00000000 00000000 00001000,那么8的补码就是等于原码(因为8是正数),补码就是00000000 00000000 00000000 00001000,将这个正数的补码和1进行&(与)运算有:

由此观察,可知,最终的结果是0,所以该数是偶数  

 

哈哈,看到这里,是不是觉得原来位运算也可以有这么有花样,比起我们经常使用的if(x%2==1)和if(x%2==0)效率更高了呢!,其实在计算机中,位运算的速度是很快的!!!

 


           2.获取指定的二进制位是0还是1

                     首先,这个题目是一个什么意思呢?,我们知道,整数都可以表示成二进制的形式,当一个整数表现成二进制的形式后,每一个二进制数位要么是0,要么是1,这个问题就是要我们判断任何指定的一位是0还是1。

                     思路:通过位运算符的移位操作和&(与)运算来实现

                     例子:比如85的二进制为  1010101,比如现在我们要求第5位二进制位是0还是1

                            现在我们知道1的补码是 00000000 00000000 00000000 00000001(正数的补码和原码相等),我们可以将1<<4,就是将1左移4位,变成  00000000 00000000 00000000 00010000,然后将这个数和85做&(与)运算,有

得到00000000 00000000 00000000 00010000这个结果之后,我们可以将这个结果,再往右边移动四位,这样我们就可以知道最终的结果是1还是0,然后根据这个结果判断,我们所指定的位置上是1还是0了

      假设这个数是x,那我们用代码是如何实现判断第5位是0还是1的呢?

            (1) 让x和1<<4进行&(与)运算

                            x&(1<<4)

            (2)将得到的结果再向右移动四位

                             (x&(1<<4))>>4

            (3)可以根据if语句来判断最终的结果是1还是0

                            if(((x&(1<<4))>>4)==1)

                            {

                                    printf("第5位上的二进制位是1");

                            }

                           else

                             {

                                   printf("第5位上的二进制位是0");

                             }

 

各位小伙伴们,虽然这个题目本质上没什么难度,但是去思考一下还是有助于我们巩固我们位运算的相关知识的,也希望各位在学习的路上能够仔细的推敲知识点,拿出你们吃东西的力气来学习!!!

                   


          3.不用判断语句,求整数的绝对值

                   看见这个的时候,是不是心里有一种感慨,我去,利用位运算还能求整数的绝对值?真的吗?不会是想糊弄我吧,博主一开始也是这样想的,但是仔细看了大神们的做法之后,就认同人家了!!!

                   分析:求负数的值是我们是将补码除了符号位取反然后+1,如果我们连符号位也取反的话,实际上就是这个数的绝对值了,所以首先我们可以得到一个负数求绝对值的表达式为

                 int   neg(int a)

               {

                    retuan ~a+1;

               }

               接下来

               我们通过移位运算来取符号位,有int i = a>>31,(>>的运算规则是如果正数,高位补0,如果是负数,高位补1),那么结果是,如果a为正数,那么i等于0,如果a为负数,那么i等于-1 ,那么我们就来判断i,从而决定要不要急性~a+1,如下

             int myMetho(int a)

             {

                    int i = a>>31;

                    return i==0?a:(~a+1);

             }

                到这一步,是不是觉得越来越神奇了呢?还有更神奇的呢?接下去看!!!

         根据前导知识,我们知道对于任何数,与0异或都是这个数本身,与-1即0xFFFFFFFF异或就相当于取反。因此a与i异或后在减去i(因为i为0或者-1,所以-i要么+0要么+1)也可以得到绝对值,所以上面的代码可以这样改,如下

             int myMetho2(int a)

            {

                  int i = a>>31;

                  return (a^i)-i;

             }

博主当初看到这里的时候都惊呆了,怎么能这么神奇呢?而且代码效率还提高了,千言万语不如化作一张动图,这样才能表达博主的心情,是不是觉得惊讶又神奇呢???


                        

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值