二进制与位运算

一、计算机中的数据

        1.计算机中的数据表示方法:

            1.计算机是一种电子设备,由于复杂的元器件组成合而成,一个电子元器件有带电和不带电两种状态,通常我们将带电状态表示为1,不带电状态表为0,多个元器件组合,可以表示更多的状态,也就是可以表示更多的数据,如000表示0,001表示1,010表示2,011表示3,依次类推,111表示7,一个元器件可以表示一位(bit)数据,这种表示数据的方法就叫二进制。
        
            2.在实际的电子设备中,我们将8个这样的元器件形成一个单元,这样的一个单元叫字节(byte),一个字节,可以表示数值的范围是0~255。
        
            3.一个字节由8个bit组成,其中最右边的一位称为:“最低有效位”或“最低位”,最左边的一位为称为:“最高有效位”或“最高位”,每个二进制是0或1。

        

        2.原码、反码和补码

           原码:将最高位做为符号位,(0代表正,1代表负),其余的代表数值本身的绝对值(以二进制表示)。
           为了简单起见,我们用1个字节代表一个整数。
                   +7的原码:                                00000111
                   -7的原码:                                10000111
           
           问题:
                    +0的源码:                                00000000
                    -0的源码:                                10000000
                   
           总结:由于正0和负0都是0,但是在计算机中表示不唯一,所以在计算机中没有采用原码这种表示信息。

                   

        3.反码:一个数如果为正,则它的反码与原码相同:一个数如果为负,则符号为1,其余位是对反码原码取反。

             为了简单起见,我们用1个字节代表一个整数。
                   +7的反码:                                00000111                                                               
                   -7的反码:                                11111000
                              
            问题:
                     +0的的反码:                            00000000
                     -0的的反码:                            11111111
            
            总结:取反的意思就是将0变为1,将1变0。
                        由于0的反码值依然是不唯一的,所以在计算机中没有采用反码这种表示信息。

        

        4.补码(1):利用溢出,我们可以将减法变成加法。

                对于十进制数,如果从9得到结果5,可以用减法。
                    9-4=5
                因为6+4=10,我们将6作为4的补数,将上式的减法改写为加法。
                    9+6=15
                去掉高位1(也就是减10),得以的结果5。
                
                对于十六进制,如果从C得到的结果5,可以用减法:
                    C-7=5
                因为7+9=16,我们将9作为7补数,将上式中的减法做为加法:
                    C+9=15
                去掉高位1(也就是减去16),得到结果5。
                

                总结:在计算机中,如果我们用1字节表示一个数,一个字节有8位,超过8位就进1,在内存的情况10000000,进位1被丢弃。       

                

        5.补码(2):一个数如果为正,则它的原码、反码、补码相同,一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1。

            为了简单起见,我们用1个字节代表一个整数。
                     +7的补码:                                         00000111
                     -7的补码:                        第(1)步:11111000
                                                                                  +            1
                                                               第(2)步:—————————
                                                                                  11111001
                                                                                 
                0的补码表示:                                                                 
                     +0的补码:                                         00000000
                     -0的补码:                        第(1)步:11111111
                                                                                  +            1
                                                               第(2)步:—————————
                                                                                  1 00000000
                                                                 第(3)步 进位1被丢弃
                                                                 
              总结:当用补码来表示的时候,数值0在计算机中表示是唯一的,计算机采用的补码的这种形式。

        

        6.补码(3):已知一个负数补码,将其转化为十进制数有三个步骤:

                 1.先对其各位取反;
                2.将其转化为十进制;
                3.加上负号减去1;
                
                例如:11111010,最高位为1,是负数,先对各位取反得00000101,转化为十进制为5,加上负号为-5,再减1得-6。

        

二、位运算

        1.Java位运算:为了方便对二进制位进行操作,Java提供了四个二进制位操作:

            &                            按拉与
            |                            按位或
            ^                            按位异或
            ~                            按位取反
            
            举例:

            1.按位与:一个房间里面有两个开关控制着房间的灯的明暗,当两个开关同进处于打开状态时,灯才能亮。

                    开关1                开关2                灯的状态
                     关                        关                        暗
                     开                        关                        暗
                     关                        开                        暗
                     开                        开                        亮                

                              01101101
                          & 00110111

                           00100101

                          结论:按位与,只有壹(1)壹(1)为1。
                          

            2.按位或:一个房间里面有两个开关控制着房间的灯的明暗,当任何一个开关处于打开状态时,灯就能亮。

                            开关1                开关2                灯的状态
                     关                        关                        暗
                     开                        关                        亮
                     关                        开                        亮
                     开                        开                        亮
            
                              01101101
                          |  00110111
                           01111111
                          结论:按位或,只有零(0)零(0)为0。

                          

            3.按位异或:一个房间里面有两个开关控制着房间的灯的明暗,当两个开关处于不同状态时,灯就能亮。

                     开关1                开关2                灯的状态
                     关                        关                        暗
                     开                        关                        亮
                     关                        开                        亮
                     开                        开                        暗
            
                              01101101
                          ^  00110111
                            01011010
                          结论:按位异或,只有零(0)壹(1),或壹(1)零(1)为1。

                          

            4.按位取反:

                        ~    01101101
                          —————————————
                              10010010
                          结论:对二进制数按位取反,即0变成1,1变成0。

三、移位运算符

         1.Java中有三种移位运算符:

         左移:<<
         带符号右移:>>
         无符号右移:>>>
        
         数                        x                            x<<2                        x>>>2
         17                00010001            00 01000100                00000100 01
         -17             11101111             11 10111100                 00111011 11

        

         2.整数常量进制表示:

  1.八进制  0 开头
  2.十六进制 0X 或 0x 开头


问题:将一个整数110,从右端开始的4到7位全部变为0

你可能感兴趣的:(java,c,byte)