位运算的整理

在计算机的世界,都是0和1 ,利用这个0和1组成了计算机的基础,数字是如何在计算机中表示的?二进制到底是什么?

数字怎么表示

在刚开始学编程的时候,有几种常见的数据基础的数据类型占用几个字节,如int 占16个字节(不同的语言体系不同,这里以C语言为例)。

一个字节可以表示两个数字0和1 ,占16个字节就可以用2^16个数字。

为了能够表示负数,单独保留一个字节作为符号位, 所以int的整型的范围是从-32768到32767 .

二进制的换算

十进制的数字是逢十进一,二进制很简单是逢二进一,比如十进制:3+9=12. 在二进制中:1+1=10.

计算二进制的方法与十进制也相同,比如在十进制中想取个十百的数字,可以分别除10的倍数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
比如取456的各位的数:       

456/10=45余6 ,

45/10=4 余5

4/10= 0余4

最终倒序返回时456

```

换成二进制的方法与十进制相同,唯一的区别是负数的表示方法不同。

``` cte
比如获得13的二进制数据:

13/2=6余1

6/2=3余0

3/2=1余1

1/2 余1

所以13 就是倒序 1101

```

负数的表示方法,**取反码,然后加1**:

``` cte

13的原码 1101,对应的反码是:0010,然后加1 ,0011(完整的数据:‭1111 1111 1111 1111 1111 1111 1111 0011‬)

常用的二进制的使用

二进制的运算效率高于其他计算方法,在日常的代码中,如果理解没有障碍的话,个人推荐优先使用位运算。

  1. 奇数和偶数的判断

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41

    a&1 = 0 偶数
    a&1 = 1 奇数

    ```

    2. 取模运算

    ``` cte

    a % (2^n) 等价于 a & (2^n - 1)

    a%16 ==> a&15

    ```


    3. 求绝对值

    ``` cte

    int abs( int x )
    {
    int y ;
    y = x >> 31 ;
    return (x^y)-y ; //or: (x+y)^y
    }

    ```

    4. 乘以2的次幂


    ``` cte

    10>>1=20

    10>>2=40

    10>>3=80

作者

付威

发布于

2018-12-11

更新于

2020-08-10

许可协议

评论