回覆列表
  • 1 # 匠工加工

    在C語言中,一般有兩種方法來操作位,一種是使用C語言提供的位運算運算子,一種是使用位域。

    1、使用位域

    在C語言中定義位域的一般格式如下:

    1

    2

    struct 位域結構名

      { 位域列表 };

    struct:在C語言中定義位域所使用的關鍵字是struct。

    位域結構名:是一個C語言中的識別符號,有字母、數字、下劃線組成,而且第一個字元必須是字母或者下劃線。

    位域列表:組其中位域列表的形式為: 型別說明符 位域名:位域長度

    下面的示例程式碼,透過位域來計算IEEE754浮點數編碼中單精度數的最大值 、最小值和最小弱規範數。

    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

    #include <stdio.h>

    typedef struct FP_SINGLE

    {

    unsigned __int32 fraction : 23;

    unsigned __int32 exp : 8;

    unsigned __int32 sign : 1;

    } fp_single;

    int main()

    {

    float x;

    fp_single * fp_s = (fp_single *)&x;

    fp_s->sign = 0;

    fp_s->exp = 0xfe;

    fp_s->fraction = 0x7fffff;

    printf ("float 最大數: %le\n",(double)x);

    fp_s->sign = 0;

    fp_s->exp = 0x1;

    fp_s->fraction = 0x0;

    printf ("float 最小數: %le\n",(double)x);

    fp_s->sign = 0;

    fp_s->exp = 0;

    fp_s->fraction = 0x1;

    printf ("float 最小弱規範數:%le\n\n",(double)x);

    return 0;

    }

    2、使用位運算子

    C語言中的位運算子有一個基本的常識,即只能操作整數,不能操作浮點數,因為浮點數是使用IEEE754編碼的,使用位運算元沒有任何意義。

    1

    2

    3

    4

    5

    6

    7

    C語言提供的位運算子列表:

    & 按位與 如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0

    | 按位或 兩個相應的二進位制位中只要有一個為1,該位的結果值為1

    ^ 按位異或 若參加運算的兩個二進位制位值相同則為0,否則為1

    ~ 取反 ~是一元運算子,用來對一個二進位制數按位取反,即將0變1,將1變0

    << 左移 用來將一個數的各二進位制位全部左移N位,右補0

    >> 右移 將一個數的各二進位制位右移N位,移到右端的低位被捨棄,對於無符號數,高位補0

  • 中秋節和大豐收的關聯?
  • sql隨機抽取幾條資料的方法,推薦?