A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 燕雀不知 中级黑马   /  2015-7-9 00:05  /  6834 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1黑马币
如题

最佳答案

查看完整内容

位就是二进制的位, 位运算有6个运算符:右移 >>>无符号右移 &与运算 |或运算 ^异或运算 ~反码 右移 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。 相当于除以2的倍数;移n位,就是除以2的n次幂。 >>>无符号右移 被移位二进制最高位无论是0或者是1,空缺位都用0补。 &与运算 二进制位进行&运算,只有1&1时结果是1,否则是0; |或运算 ...

10 个回复

倒序浏览

位就是二进制的位,
位运算有6个运算符:<<左移   >>右移   >>>无符号右移   &与运算   |或运算   ^异或运算   ~反码
<<左移              空位补0,被移除的高位丢弃,空缺位补0。
                   相当于乘以2的倍数;移n位,就是乘以2的n次幂。
>>右移              被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。
                  相当于除以2的倍数;移n位,就是除以2的n次幂。
>>>无符号右移  被移位二进制最高位无论是0或者是1,空缺位都用0补。
&与运算             二进制位进行&运算,只有1&1时结果是1,否则是0;
|或运算               二进制位进行 | 运算,只有0 | 0时结果是0,否则是1;
^异或运算          任何相同二进制位进行 ^ 运算,结果是0; 1^1=0 , 0^0=0
                    不相同二进制位 ^ 运算结果是1。 1^0=1 , 0^1=1
~反码                  二进制取反,1变0,0变1
回复 使用道具 举报
亲,你说的是移位运算吧?移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。
回复 使用道具 举报
你说的是交换位置的运算么?也就是二进制的移位运算。移位运算有三种,分别是左移、右移、无符号右移。<<   左移    左边高位舍弃,右边空白部分补齐0。 >>   右移    如果最高位是0,左边被移空部分补0,如果最高位是1,左移空白部分补齐1。 >>>   无符号右移,不管移出位是什么,空白处均用0补齐。希望对你有帮助   
回复 使用道具 举报
1.左移运算<<  左移右移都是移动二进制数

0000-0000 0000-0000 0000-0000 0000-1100     =12 向左移动一位变为(右边缺几位就补几个0)

      0000-0000 0000-0000 0000-0000 0001 1000       =24 再向左移一位

   0000-0000 0000-0000 0000-0000 0011 0000         =48

由此,我们可以得到,其实m向左移n位后,m=m*2^n;即每向左移一位,该数就会增到一倍。


2.右移运算和左移运算类似,但是也有一个区别。

              0000-0000 0000-0000 0000-0000 0000-1100            =12 向右移一位

        0000-0000 0000-0000 0000-0000 0000-0110          =6再向右移一位

                   0000-0000 0000-0000 0000-0000 0000-0011       =3再向右移动一位

      0000-0000 0000-0000 0000-0000 0000-0001    =1

我们也可以得到一个规律,每向右移动一位,该数就会减小一倍(按计算机的整数规律减小)



>>向右移动的过程中,左边是补0还是1,是根据原来的数的最高位来确定的,原来数的最高位是1,则补1,否则补0

   >>> 向右移动的过程中,不管原来数的最高位是1还是0,都补0,所以我们应该根据需要来选择,右移是用>>>还是>>.

  3.&与运算

与运算同样都是对二进制位来说的。比如14&7=2(省略了前面的二进制位)

1010

          &0111

      ----------------

              0010

      4.|或运算 与与运算类似(略)

  5.~运算也都差不多

  6.^异或运算,我们主要看一下异或运算  12^7=11

1100

        
       ^0111

--------------------------

               1011

   异或运算就是两个数不相同则为1,相同则为0。

   7.我们讲一下在计算机中是怎样将二进制转化为16进制的

     0000-0000 0000-0000 0000-0000 0010-1011

     我们都知道,只要将每四位一取,然后对每一项算出它的16进制,然后再合起来就是2进制的16进制的表现形式

    上面的数据应该是  2 11

    那计算机是怎样算的呢?这儿就是用&运算来完成的,

    首先,将上数进行下面的与运算

    0000-0000 0000-0000 0000-0000 0010-1011

  &0000-0000 0000-0000 0000-0000 0000-1111

---------------------------------------------------------------------

    0000-0000 0000-0000 0000-0000 0000-1011

  这样,我们就把上面的数据的最后四位二进制位取出来了,然后进行计算就得到16进制的值

  如果我们要把倒数的第二个四位二进制位取出来,那又该怎么取呢?

我们只需要把该书向右移四位,然后再取就ok了。非常简单吧,这也是位运算在计算机中的应用之一。


8.接下来我们讲一下,用位运算怎么交换两个数

int a=8,b=2;

     最普通的方法:int temp=a,a=b,b=temp,最简单最常用的,不多说。

     稍微高级一点的:a=a+b

  b=a-b

  a=a-b

     再高级一点的位运算:a=a^b

b=a^b

a=a^b

   这是为什么?

   因为异或运算有一个特点,如下10^8=2

                   1010

  ^1000

               ------------

                    0010   

    但是10^8^8=????    =10

                          0010

                      ^  1000

                      -------------

                          1010

也就是说,n^m^m=n,神奇吧,慢慢领会就会了。
回复 使用道具 举报
移位运算就是把数字换算成二进制后进行的左移右移,然后用0补全之后所得到的数值
回复 使用道具 举报
我这里有个demo 你看下 求点分~~

/*
运算符:
        运算符用来连接操作数,组成有意义的式子
分类:
        算是   关系    逻辑   位运算

位运算:
        用于整数的二进制位之间的运算

        & 按位与:如果两个位进行&操作,同1则结果为1,有0结果就为0
            任何数和1进行&操作,得到这个数的最低位(以此可知,可通过最低位判断该数奇偶性,1为奇,0为偶)


        |  按位或:如果两个位进行&操作,有1则结果为1,同0结果就为0

        ~ 按位取反:1变0,0变1

        ^ 按位异或:相同为0,不同为1


        << 左移位: 左侧、高位移动出去的位就丢了,低位开始补0
            记忆的技巧:x向左移动n位,相当于x*(2^n) (原数乘以2的n次方)

        >>右移位: 移除去的部分舍弃,高位补符号位(右移不会改变一个数的正负性)
            记忆的技巧:x向右移n位,值等于 x/(2^n)的整数部分  (原数除以2的n次方,结果取整)



        &:   9 & 8
            00000000000000000000000000001001
           &00000000000000000000000000001000
    ----------------------------------------------
            00000000000000000000000000001000


        |:   9 | 8
            00000000000000000000000000001001
           |00000000000000000000000000001000
    ----------------------------------------------
            00000000000000000000000000001001


        ~: ~9;
            00000000000000000000000000001001
            ~
     ----------------------------------------------
            11111111111111111111111111110110        补(最高位1为补码要转为原码)
            10000000000000000000000000001001        反
            10000000000000000000000000001010        原 -10


        ^ 9^8
            00000000000000000000000000001001
           ^00000000000000000000000000001000
    --------------------------------------------
            00000000000000000000000000000001




        <<  8<<2   ==32
            00000000000000000000000000001000
          <<2 00000000000000000000000000100000 :32

*/
void opintionS(){
    //按位与
    int result = 9&8 ;
    // 按位或
    result = 9|8;
    // 按位取反
    result = ~9;
    // 9异或8
    result = 9^8;
   
    printf("result=%d\n",result);
}
回复 使用道具 举报
位运算是以二进制补码的形式进行的
回复 使用道具 举报
本帖最后由 孟卫严 于 2015-7-9 21:58 编辑

位运算是考虑在机器中运算比较高效
如 <<左移运算符
    >>右移运算符
    >>>无符号右移,又叫绝对右移
他们主要涉及到二进制,如果你知道二进制就很简单
如果你不知道,建议你先看看数字的二进制表示
只要记住机器里面的运算都是   补码   
而显示的都是    原码
这个关键点就一点都不迷
回复 使用道具 举报

位运算符
        &  按位与 : 有0则0, 全1才1
        |  按位或 : 有1则1, 全0才0
        ^  按位异或 : 相同为0, 不同为1
        ~  按位取反 : 所有的1变0, 0变1

        ^ : 一个数据对同一个数据^两次,结果还是数据本身。
                举例:a ^ b ^ b = a
        左移 <<  -- 高位舍弃,右侧补0, 相当于乘以2的指定次幂
        右移 >>  -- 高位是1补1,高位是0补0, 低位舍弃, 相当于除以2的指定次幂
        无符号右移 >>>  --高位补0,低位舍弃.
                       
        如果一个数快接近int所能表达的最大值,那么左移就会溢出
回复 使用道具 举报
本帖最后由 徐鹏辰 于 2015-7-11 17:10 编辑

位就是二进制的位,
位运算有6个运算符:<<左移   >>右移   >>>无符号右移   &与运算   |或运算   ^异或运算   ~反码
<<左移              空位补0,被移除的高位丢弃,空缺位补0。
                   相当于乘以2的倍数;移n位,就是乘以2的n次幂。
>>右移              被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。
                  相当于除以2的倍数;移n位,就是除以2的n次幂。
>>>无符号右移  被移位二进制最高位无论是0或者是1,空缺位都用0补。
&与运算             二进制位进行&运算,只有1&1时结果是1,否则是0;
|或运算               二进制位进行 | 运算,只有0 | 0时结果是0,否则是1;
^异或运算          任何相同二进制位进行 ^ 运算,结果是0; 1^1=0 , 0^0=0
                    不相同二进制位 ^ 运算结果是1。 1^0=1 , 0^1=1
~反码                  二进制取反,1变0,0变1

规律:&有假则假;|有真则真;^同假异真。(1—真,0—假)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马