❶ c語言中如何定義一個bit
1、在c語言中定義bit型變數,可以使用位域來自定義。
位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:
struct 位域結構名
{ 位域列表 };
其中位域列表的形式為: 類型說明符 位域名:位域長度;
2、示例:通過位域來計算IEEE754浮點數標准中,單精度浮點數的最大值、最小值以及最小弱規范數。
#include<stdio.h>
typedefstructFP_SINGLE
{
unsigned__int32fraction:23;
unsigned__int32exp:8;
unsigned__int32sign:1;
}fp_single;
intmain()
{
floatx;
fp_single*fp_s=(fp_single*)&x;
fp_s->sign=0;
fp_s->exp=0xfe;
fp_s->fraction=0x7fffff;
printf("float最大數:%le ",(double)x);
fp_s->sign=0;
fp_s->exp=0x1;
fp_s->fraction=0x0;
printf("float最小數:%le ",(double)x);
fp_s->sign=0;
fp_s->exp=0;
fp_s->fraction=0x1;
printf("float最小弱規范數:%le ",(double)x);
return0;
}
❷ 為什麼C語言能進行對位(bit)操作 對位操作有什麼效果
當然可以對位進行操作。
一般來說,用位運算就是對位操作。位運算包括
^ 異或
| 位或
& 位與
~ 位求反
>> 右移位
<< 左移位
對位操作的好處是快,並且基本上和匯編一一對應,可以直接算出運算時間,計算速度。
很多要表達硬體計算,或者提高運算速度的時候,都會直接用位運算。
比如乘16,位運算就是左移4位等等。
另外一種是位域。
就是定義一種特殊的結構體,裡面的成員只有規定的幾位。
比如
struct instruction{
unsigned short sr:5;
unsigned short tr:5;
unsigned short op:6;
};
就定義了一個16bit指令的結構,其中
sr : tr : op
1-5 : 6-10 :11-16
然後就可以這樣操作
struct instruction mov_r1_r3 = {0x01, 0x03, 0x01};
那麼mov_r1_r3實際上等於0x0461
這樣編代碼一般是為了和硬體介面容易,完全的底層操作
實際代碼中極少出現,一般出現於與硬體的介面當中.
❸ c語言的按位運算符怎麼操作!
位運算
在很多系統程序中常要求在位(bit)一級進行運算或處理。C語言提供了位運算的功能,
這使得C語言也能像匯編語言一樣用來編寫系統程序。
一、位運算符C語言提供了六種位運算符:
&
按位與
|
按位或
^
按位異或
~
取反
<<
左移
>>
右移
1.
按位與運算
按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1
,否則為0。參與運算的數以補碼方式出現。
例如:9&5可寫算式如下:
00001001
(9的二進制補碼)&00000101
(5的二進制補碼)
00000001
(1的二進制補碼)可見9&5=1。
按位與運算通常用來對某些位清0或保留某些位。例如把a
的高八位清
0
,
保留低八位,
可作
a&255
運算
(
255
的二進制數為0000000011111111)。
main(){
int
a=9,b=5,c;
c=a&b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
2.
按位或運算
按位或運算符「|」是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
例如:9|5可寫算式如下:
00001001|00000101
00001101
(十進制為13)可見9|5=13
main(){
int
a=9,b=5,c;
c=a|b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
3.
按位異或運算
按位異或運算符「^」是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下:
00001001^00000101
00001100
(十進制為12)
main(){
int
a=9;
a=a^15;
printf("a=%d\n",a);
}
4.
求反運算
求反運算符~為單目運算符,具有右結合性。
其功能是對參與運算的數的各二進位按位求反。例如~9的運算為:
~(0000000000001001)結果為:1111111111110110
5.
左移運算
左移運算符「<<」是雙目運算符。其功能把「<<
」左邊的運算數的各二進位全部左移若干位,由「<<」右邊的數指定移動的位數,
高位丟棄,低位補0。例如:
a<<4
指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。6.
右移運算右移運算符「>>」是雙目運算符。其功能是把「>>
」左邊的運算數的各二進位全部右移若干位,「>>」右邊的數指定移動的位數。
例如:設
a=15,a>>2
表示把000001111右移為00000011(十進制3)。應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時,
最高位補0,而為負數時,符號位為1,最高位是補0或是補1
取決於編譯系統的規定。Turbo
C和很多系統規定為補1。
main(){
unsigned
a,b;
printf("input
a
number:
");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d\tb=%d\n",a,b);
}
請再看一例!
main(){
char
a='a',b='b';
int
p,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}
❹ bit用法——單片機C語言
bit 在C51裡面類似C語言的bool,bit定義的是一個位數據類型,只能為0或1兩個值
❺ c語言位運算問題
c語言位運算問題解答:
要解答這個問題我們先來看一個例子,代碼如下圖一,圖中右邊是問題中得到代碼,左邊是這段代碼的匯編指令。兩種情況的不同點詳細說明如下:
第一種情況:
printf("%d",2>>64);
由圖中的匯編代碼可以看出,如果兩個數都是常數的情況下,代碼中是不含對應的匯編指令的,因為編譯器已經省略了,編譯器算出結果為0,直接把0傳入給printf函數。
第二種情況:
int i=2;
printf("%d",i>>64);
此時i是個變數,編譯器沒法在編譯時算出結果,這時就需要通過SARL算術右移指令進行,這里考慮到溢出這個指令有一個調整機制,它會根據左操作數i類型來調整右操作數,比如這里i是4位元組32位,也就是它最多右移32位,如果右操作數大於32它會進行64%32=0,所以i>>64相當於i>>0,如果是i>>63,63%32=31相當於i>>31。這種調整不同的編譯器可能會不同,目前GCC是這樣的。
所以這個代碼在GCC環境下輸出結果為:
0
2
補充說明:如果想要了解更多可以寫出代碼,然後觀察編譯出來的匯編代碼。
gcc -S test.c
圖一
❻ c語言bit操作問題
C語言支持位操作,示例如下:
/* 要操作的位元組變數為i */
unsigned char i;
i = i & 0x7f; /* 把最高位置0,其餘位不變 */
i = i | 0x80; /* 把最高位置1,其餘位不變 */
i = i & 0xbf; /* 把第二位置0,其餘位不變 */
i = i | 0x40; /* 把第二位置1,其餘位不變 */
................................
❼ C語言中的位運算是怎樣的
如果你把所有的操作數都用二進制來表達就清晰了,如下
位與 & 相同位按與來運算即可 如:
1 & 2 =0
-------------
二進制是這樣的 01 & 10 = 00
位或 | 一樣,按位來或即可
1|2 = 3
--------------
二進制是這樣: 01|10=11
其他位運算都是按二進制位來運算的,你轉換成2進制就好理解了
❽ 為什麼C語言能進行位(bit)操作
在編程時,有時要為程序定義很多bool型變數
比如:
struct XX{
bool bReady,bLoaded,bRender,bShow;
};
這樣很羅嗦,我們換一種方法:1個32位的long型變數 本身可以代表32個bool型
我們先定義
#define FLAG_READY 0x0001
#define FLAG_SHOW 0x0002
#define FLAG_LOADED 0x0004
這樣
再搞一個 long Flag;變數
設置和取消該標志位用 Flag|=FLAG_SHOW 和 Flag&=~FLAG_SHOW
判斷使用 if (Flag & FLAG_SHOW) {...}
比以前的方便,而且Microsoft 的函數API很多都是這種方式
❾ c語言如何操作二進制文件的每一bit
小文件的話讀到內存,大文件分段讀到內存,用指針操作賦值,在寫回到文件。
❿ C語言 什麼叫位操作
如果state&0x8000的值為0,則state&0x8000?1:0的結果就是0,否則就是1。
state&0x8000是按位進行與操作,與操作就是把兩個數都轉化為二進制數,然後對應位依次進行比較,如果對應位都為1,那麼與操作結果就是1,如果沒有對應位都為1的情況,那麼與操作結果就是0。
0x8000是十六進制數,轉換成二進制就是1000
0000
0000
0000,然後與state的值按位進行與操作。這里如果state的值也為0x8000,那麼這個與操作結果就是1,否則與操作結果就是0.