㈠ 在單片機c語言中如何對變數的某一位進行操作或賦值。
在C語言中,一般有兩種方法來操作位,一種是使用C語言提供的位運算操作符,一種是使用位域。
1、使用位域
在C語言中定義位域的一般格式如下:
struct位域結構名
{位域列表};
struct:在C語言中定義位域所使用的關鍵字是struct。
位域結構名:是一個C語言中的標識符,有字母、數字、下劃線組成,而且第一個字元必須是字母或者下劃線。
位域列表:組其中位域列表的形式為: 類型說明符 位域名:位域長度
下面的示例代碼,通過位域來計算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;
}
2、使用位運算符
C語言中的位運算符有一個基本的常識,即只能操作整數,不能操作浮點數,因為浮點數是使用IEEE754編碼的,使用位操作數沒有任何意義。
C語言提供的位運算符列表:
&按位與如果兩個相應的二進制位都為1,則該位的結果值為1,否則為0
|按位或兩個相應的二進制位中只要有一個為1,該位的結果值為1
^按位異或若參加運算的兩個二進制位值相同則為0,否則為1
~取反~是一元運算符,用來對一個二進制數按位取反,即將0變1,將1變0
<<左移用來將一個數的各二進制位全部左移N位,右補0
>>右移將一個數的各二進制位右移N位,移到右端的低位被舍棄,對於無符號數,高位補0
㈡ c語言中復合位運算賦值(&=,|=,^=,>>=,<<=)表示什麼意思
&=,按位與後賦值,變數&=表達式;
|=,按位或後賦值,變數|=表達式;
^=,按位異或後賦值,變數^=表達式;
>>=,右移後賦值,變數>>=表達式;
<<=,左移後賦值,變數<<=表達式;
類似的還有,
/=,除後賦值,變數/=表達式;
*=,乘後賦值,變數*=表達式;
%=,取模後賦值,變數%=表達式;
+=,加後賦值變數,+=表達式;
-=,減後賦值變數,-=表達式;
這些是C/C++獨有的復合賦值運算符,結合方向,從右向左。是一種縮寫形式,使得對變數的改變更為簡潔,更有效率。
㈢ c語言,位符合賦值運算符, <<=,>>=,&=,^=,!=, 分別什麼含義啊
1.=
賦值運算符
變數=表達式
如:a=3;將a的值賦為3
2./=
除後賦值
變數/=表達式
如:a/=3;即a=a/3
3.*=
乘後賦值
變數*=表達式
如:a*=3;即a=a*3
4.%=
取模後賦值
變數%=表達式
如:a%=3;即a=a%3
5.+=
加後賦值
變數+=表達式
如:a+=3;即a=a+3
6.-=
減後賦值
變數-=表達式
如:a-=3;即a=a-3
7.<<=
左移後賦值
變數<<=表達式
左移就是將《左邊的數的二進制各位全部左移若干位,《右邊的數指定移動位數,高位丟棄,低位補0,
移幾位就相當於乘以2的幾次方
8.>>=
右移後賦值
變數>>=表達式
右移運算符是用來將一個數的各二進制位右移若干位,移動的位數由右操作數指定(右操作數必須是非負值),移到右端的低位被舍棄,對於無符號數,高位補0。對於有符號數,某些機器將對左邊空出的部分用符號位填補(即「算術移位」),而另一些機器則對左邊空出的部分用0填補(即「邏輯移位」)。注意:對無符號數,右移時左邊高位移入0;對於有符號的值,如果原來符號位為0(該數為正),則左邊也是移入0。如果符號位原來為1(即負數),則左邊移入0還是1,要取決於所用的計算機系統。有的系統移入0,有的
系統移入1。移入0的稱為「邏輯移位」,即簡單移位;移入1的稱為「算術移位」。
9.&=
按位與後賦值
變數&=表達式
按位與是指:參加運算的兩個數據,按二進制位進行「與」運算。如果兩個相應的二進制位都為1,則該位的結果值為1;否則為0。這里的1可以理解為邏輯中的true,0可以理解為邏輯中的false。按位與其實與邏輯上「與」的運算規則一致。邏輯上的「與」,要求運算數全真,結果才為真。若,A=true,B=true,則A∩B=true
10.
^=
按位異或後賦值
變數^=表達式
參與運算的兩個量按照對應的位進行異或運算,且
0^0→0,
0^1→1,
1^0→1,
1^1→0
此外,一個數與0異或仍保持不變,即a^0=a
一個數與自己異或結果為0,即a^a=0
11.|=
按位或後賦值
變數|=表達式
參與運算的兩個量按照對應位進行或運算,且
0|0→0,
0|1→1,
1|0→1,
1|1→1
這些位運算都是與二進制碼有關的,所以多弄弄也就會了
㈣ c語言,位符合賦值運算符, <<=,>>=,&=,^=,!=, 分別什麼含義啊
1.= 賦值運算符 變數=表達式 如:a=3;將a的值賦為3
2./= 除後賦值 變數/=表達式 如:a/=3;即a=a/3
3.*= 乘後賦值 變數*=表達式 如:a*=3;即a=a*3
4.%= 取模後賦值 變數%=表達式 如:a%=3;即a=a%3
5.+= 加後賦值 變數+=表達式 如:a+=3;即a=a+3
6.-= 減後賦值 變數-=表達式 如:a-=3;即a=a-3
7.<<= 左移後賦值 變數<<=表達式 左移就是將《左邊的數的二進制各位全部左移若干位,《右邊的數指定移動位數,高位丟棄,低位補0, 移幾位就相當於乘以2的幾次方
8.>>= 右移後賦值 變數>>=表達式 右移運算符是用來將一個數的各二進制位右移若干位,移動的位數由右操作數指定(右操作數必須是非負值),移到右端的低位被舍棄,對於無符號數,高位補0。對於有符號數,某些機器將對左邊空出的部分用符號位填補(即「算術移位」),而另一些機器則對左邊空出的部分用0填補(即「邏輯移位」)。注意:對無符號數,右移時左邊高位移入0;對於有符號的值,如果原來符號位為0(該數為正),則左邊也是移入0。如果符號位原來為1(即負數),則左邊移入0還是1,要取決於所用的計算機系統。有的系統移入0,有的
系統移入1。移入0的稱為「邏輯移位」,即簡單移位;移入1的稱為「算術移位」。
9.&= 按位與後賦值 變數&=表達式 按位與是指:參加運算的兩個數據,按二進制位進行「與」運算。如果兩個相應的二進制位都為1,則該位的結果值為1;否則為0。這里的1可以理解為邏輯中的true,0可以理解為邏輯中的false。按位與其實與邏輯上「與」的運算規則一致。邏輯上的「與」,要求運算數全真,結果才為真。若,A=true,B=true,則A∩B=true
10. ^= 按位異或後賦值 變數^=表達式 參與運算的兩個量按照對應的位進行異或運算,且
0^0→0, 0^1→1, 1^0→1, 1^1→0
此外,一個數與0異或仍保持不變,即a^0=a
一個數與自己異或結果為0,即a^a=0
11.|= 按位或後賦值 變數|=表達式 參與運算的兩個量按照對應位進行或運算,且
0|0→0, 0|1→1, 1|0→1, 1|1→1
這些位運算都是與二進制碼有關的,所以多弄弄也就會了
㈤ c語言賦值語句
復制的:
(1)C++的賦值語句具有其他高級語言的賦值語句的功能。但不同的是: C++中的賦值號「=」是一個運算符,可以寫成
a=b=c=d;
而在其他大多數語言中賦值號不是運算符,上面的寫法是不合法的。
(2) 關於賦值表達式與賦值語句的概念。在C++中,賦值表達式可以包括在其他表達式之中,例如
if((a=b)>0) cout<<"a>0"<<endl;
按語法規定if後面的( )內是一個條件。現在在x的位置上換上一個賦值表達式「a=b」,其作用是:先進行賦值運算(將b的值賦給a),然後判斷a是否大於0,如大於0,執行cout<<"a>0"<<endl;。在if語句中的「a=b」不是賦值語句而是賦值表達式,這樣寫是合法的。不能寫成
if((a=b;)>0) cout<<"a>0"<<endl;
因為在if的條件中不能包含賦值語句。C++把賦值語句和賦值表達式區別開來,增加了表達式的種類,能實現其他語言中難以實現的功能。
請採納。
㈥ C語言 按位運算 的復合賦值運算符 問題
i&=j就是i=i&j;,i被重新賦值了,下同
㈦ 關於C語言位運算,賦值的問題,回答詳細一點。為什麼按位取反後輸出的結果不一樣
2的二進制是00000010,取反得到11111101,最高位為1,說明這是個負數的補碼。負數的補碼,是由其絕對值的原碼取反加1得到,反過來,將負數的補碼減1取反,就得到其絕對值的原碼。11111101-1=11111100,再取反得到00000011,即十進制的3。也就是說該負數的絕對值為3,那麼這個負數為-3。
所以第一個值是-3
整型的每一種都分有無符號(unsigned)和有符號(signed)兩種類型(float和double總是帶符號的),在默認情況下聲明的整型變數都是有符號的類型(char有點特別),如果需聲明無符號類型的話就需要在類型前加上unsigned。
你聲明變數無符號,將二進制轉換無符號在轉換十進制,導致最高位由原來的符號位變成了有效數字位了,參與轉換
所以最後結果是253
你去掉前面的unsigned 兩個值應該是一樣的
㈧ c語言按位運算
unsigned在內存中佔2位元組即十六位,八進制123456轉換為二進制1010011100101110,b=a>>4 b=0000101001110010
c=0000000000001111 b&c即按位與,二進制對應位上全是1才為1,否則為0
d=0000000000000010
即d=2
㈨ C語言 怎麼用 1條語句 進行位賦值
取 b的第5位: (b & 0x10)
清 a 的第5位: (a & 0xef)
賦值到a的第5位: a = (a & 0xef) | (b & 0x10);
㈩ 51單片機c語言編程能給位賦值么
keil的話可以。打開你的reg51(或reg52等)頭文件,你就會看到已經聲明的位變數,
格式是:sbit 位變數名=SFR名^位地址值 (P3也是頭文件中最開始部分聲明的)
頭文件中有
sbit WR=P3^6;
所以你直接寫 WR=1就行了