在C語言中,一般有兩種方法來操作位,一種是使用C語言提供的位運算運算子,一種是使用位域。
1、使用位域
在C語言中定義位域的一般格式如下:
1
2
struct 位域結構名
{ 位域列表 };
struct:在C語言中定義位域所使用的關鍵字是struct。
位域結構名:是一個C語言中的識別符號,有字母、數字、下劃線組成,而且第一個字元必須是字母或者下劃線。
位域列表:組其中位域列表的形式為: 型別說明符 位域名:位域長度
下面的示例程式碼,透過位域來計算IEEE754浮點數編碼中單精度數的最大值 、最小值和最小弱規範數。
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->exp = 0x1;
fp_s->fraction = 0x0;
printf ("float 最小數: %le\n",(double)x);
fp_s->exp = 0;
fp_s->fraction = 0x1;
printf ("float 最小弱規範數:%le\n\n",(double)x);
return 0;
}
2、使用位運算子
C語言中的位運算子有一個基本的常識,即只能操作整數,不能操作浮點數,因為浮點數是使用IEEE754編碼的,使用位運算元沒有任何意義。
C語言提供的位運算子列表:
& 按位與 如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0
| 按位或 兩個相應的二進位制位中只要有一個為1,該位的結果值為1
^ 按位異或 若參加運算的兩個二進位制位值相同則為0,否則為1
~ 取反 ~是一元運算子,用來對一個二進位制數按位取反,即將0變1,將1變0
<< 左移 用來將一個數的各二進位制位全部左移N位,右補0
>> 右移 將一個數的各二進位制位右移N位,移到右端的低位被捨棄,對於無符號數,高位補0
在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