c語言移位運算符

c語言移位運算符

平臺用戶的互動中精選與c語言移位運算符相關的:1、C語言中左移運算符的問題 2、C語言中怎樣表示移位?例如將某個值左移兩位 3、C語言按位左移運算規則 4、C語言中 移位 和 按位 和 +-*/ 的優先級是怎么樣的 6、c語言的左移運算符 7、C語言中,與2乘左移,與2除右移,這個是啥意思,求詳細解釋。! 8、c語言移位運算符用在數組上疑問 10、C語言中的左移和右移?
c語言移位運算符
平臺用戶 2018-06-06 17:03:22

下面是精選平臺用戶互動時的最佳討論

aabaabaab001
aabaabaab001


aabaabaab001:C語言中左移運算符的問題

#include"stdio.h" void main() {char ch; ch='e'; ch<<4; printf("%c\n",ch); } 運行結果是e #include"stdio.h" void main() {char ch; ch='e'; ch=ch<<4; printf("%c\n",ch); } 運行結果是P <<左移運算符可以將ASCII值左移?看書上寫的... #include"stdio.h"

void main()
{char ch;
ch='e';
ch<<4;
printf("%c\n",ch);
}
運行結果是e
#include"stdio.h"

void main()
{char ch;
ch='e';
ch=ch<<4;
printf("%c\n",ch);
}
運行結果是P
<<左移運算符可以將ASCII值左移?看書上寫的<<是左移‘位’啊。。。上面的2個運行結果也是完全不懂,麻煩高手詳細解釋一下啊
下面的解答已被4516人點贊
void main()
{char ch;
ch='e';
ch<<4;//對ch代表的2進制碼左移4位但根本沒有把新值賦給ch,ch保持原值不變,例如int a = 5; a - 1; a還是5啊,對吧? :),所以結果是e啦
printf("%c\n",ch);
}

void main()
{char ch;
ch='e';
ch=ch<<4;//ch的ascll碼是101,轉換成2進制是01100101,左移4位是01010000,轉換成10進制是80,正好是大寫P的ascll值,所以結果是P啦
printf("%c\n",ch);
}
最后一次編輯時間 推薦于2017-11-22 13:48:46
知道手機網友
知道手機網友


知道手機網友:C語言中怎樣表示移位?例如將某個值左移兩位

下面的解答已被2474人點贊
利用位操作:"<<"就是左移  ">>"就是右移

舉個例子:將a左移2位,然后賦給a
a<<=2 也即是a=a<<2

在C語言中左移1位,相當于乘2,右移相當于除2。
最后一次編輯時間 2010-09-02
大學城廣東工大
大學城廣東工大


大學城廣東工大:C語言按位左移運算規則

C語言按位左移運算符<<是怎么運算的?左移時最高位去哪里?假設移動一位?
下面的解答已被8133人點贊

C語言中按位左移的運算符為<<,其規則如下:

對于操作a<<n,

1 按照二進制值每位向高位(書寫上是向左)移動n位;

2 最高位(最左邊的)n位舍去;

3 最低位(最右邊)填加n個0.


簡單起見,用char型舉例如下:

例一

0x12 << 3 =>

B00010010 << 3 =>

B10010 000(這里最高位的三個0被舍去,其它依次左移,最低位補三個0) =>

0x90

即0x12 << 3 = 0x90

例二

0x9E << 2 =>

B10011110 << 2 =>

B01111000 (最高位10舍去,最低位補兩個0)=>

0x78


可以編寫如下程序驗證:

#include <stdio.h>
void check(char a, int n)
{
    printf("0x%hhx << %d = 0x%hhx\n", a, n, a<<n);
}

int main()
{
    check(0x12, 3);
    check(0x9e, 2);
    
    return 0;
}

其運行結果為

0x12 << 3 = 0x90
0x9e << 2 = 0x78

可以看到與我們計算結果是相符的。

最后一次編輯時間 推薦于2017-09-14 12:08:43
binlaniua
binlaniua


binlaniua:C語言中 移位 和 按位 和 +-*/ 的優先級是怎么樣的

下面的解答已被1353人點贊
下面是C語言中所使用的運算符的優先級和結合性: 
優先級 運算符 結合性
(最高) () [] -> . 自左向右
! ~ ++ -- + - * & sizeof 自右向左
* / % 自左向右
+ - 自左向右
<< >> 自左向右
< <= > >= 自左向右
== != 自左向右
& 自左向右
^ 自左向右
| 自左向右
&& 自左向右
|| 自左向右
?: 自右向左
= += -= *= /= %= &= ^= |= <<= >>= 自右向左
(最低) , 自左向右
還有指針運算符、sizeof運算符、數組運算符[]等等

一、賦值運算符
賦值語句的作用是把某個常量或變量或表達式的值賦值給另一個變量。符號為‘=’。這里并不是等于的意思,只是賦值,等于用‘==’表示。
注意:賦值語句左邊的變量在程序的其他地方必須要聲明。
得已賦值的變量我們稱為左值,因為它們出現在賦值語句的左邊;產生值的表達式我們稱為右值,因為她它們出現在賦值語句的右邊。常數只能作為右值。
例如:
count=5;
total1=total2=0;
第一個賦值語句大家都能理解。
第二個賦值語句的意思是把0同時賦值給兩個變量。這是因為賦值語句是從右向左運算的,也就是說從右端開始計算。這樣它先total2=0;然后total1=total2;那么我們這樣行不行呢?
(total1=total2)=0;
這樣是不可以的,因為先要算括號里面的,這時total1=total2是一個表達式,而賦值語句的左邊是不允許表達式存在的。

二、算術運算符
在C語言中有兩個單目和五個雙目運算符。
符號 功能
+ 單目正
- 單目負
* 乘法
/ 除法
% 取模
+ 加法
- 減法
下面是一些賦值語句的例子, 在賦值運算符右側的表達式中就使用了上面的算術運算符:
Area=Height*Width;
num=num1+num2/num3-num4;
運算符也有個運算順序問題,先算乘除再算加減。單目正和單目負最先運算。
取模運算符(%)用于計算兩個整數相除所得的余數。例如:
a=7%4;
最終a的結果是3,因為7%4的余數是3。
那么有人要問了,我要想求它們的商怎么辦呢?
b=7/4;
這樣b就是它們的商了,應該是1。
也許有人就不明白了,7/4應該是1.75,怎么會是1呢?這里需要說明的是,當兩個整數相除時,所得到的結果仍然是整數,沒有小數部分。要想也得到小數部分,可以這樣寫7.0/4或者7/4.0,也即把其中一個數變為非整數。
那么怎樣由一個實數得到它的整數部分呢?這就需要用強制類型轉換了。例如:
a=(int) (7.0/4);
因為7.0/4的值為1.75,如果在前面加上(int)就表示把結果強制轉換成整型,這就得到了1。那么思考一下a=(float) (7/4);最終a的結果是多少?
單目減運算符相當于取相反值,若是正值就變為負值,若是負數就變為正值。
單目加運算符沒有意義,純粹是和單目減構成一對用的。

三、邏輯運算符
邏輯運算符是根據表達式的值來返回真值或是假值。其實在C語言中沒有所謂的真值和假值,只是認為非0為真值,0為假值。
符號 功能
&& 邏輯與
|| 邏輯或
! 邏輯非
例如:
5!3;
0||-2&&5;
!4;

當表達式進行&&運算時,只要有一個為假,總的表達式就為假,只有當所有都為真時,總的式子才為真。當表達式進行||運算時,只要有一個為真,總的值就為真,只有當所有的都為假時,總的式子才為假。邏輯非(!)運算是把相應的變量數據轉換為相應的真/假值。若原先為假,則邏輯非以后為真,若原先為真,則邏輯非以后為假。
還有一點很重要,當一個邏輯表達式的后一部分的取值不會影響整個表達式的值時,后一部分就不會進行運算了。例如:
a=2,b=1;
a||b-1;
因為a=2,為真值,所以不管b-1是不是真值,總的表達式一定為真值,這時后面的表達式就不會再計算了。

四、關系運算符
關系運算符是對兩個表達式進行比較,返回一個真/假值。
符號 功能
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
!= 不等于
這些運算符大家都能明白,主要問題就是等于==和賦值=的區別了。
一些剛開始學習C語言的人總是對這兩個運算符弄不明白,經常在一些簡單問題上出錯,自己檢查時還找不出來?聪旅娴拇a:
if(Amount=123) ……
很多新人都理解為如果Amount等于123,就怎么樣。其實這行代碼的意思是先賦值Amount=123,然后判斷這個表達式是不是真值,因為結果為 123,是真值,那么就做后面的。如果想讓當Amount等于123才運行時,應該if(Amount==123) ……

五、自增自減運算符
這是一類特殊的運算符,自增運算符++和自減運算符--對變量的操作結果是增加1和減少1。例如:
--Couter;
Couter--;
++Amount;
Amount++;

看這些例子里,運算符在前面還是在后面對本身的影響都是一樣的,都是加1或者減1,但是當把他們作為其他表達式的一部分,兩者就有區別了。運算符放在變量前面,那么在運算之前,變量先完成自增或自減運算;如果運算符放在后面,那么自增自減運算是在變量參加表達式的運算后再運算。這樣講可能不太清楚,看下面的例子:
num1=4;
num2=8;
a=++num1;
b=num2++;

a =++num1;這總的來看是一個賦值,把++num1的值賦給a,因為自增運算符在變量的前面,所以num1先自增加1變為5,然后賦值給a,最終a也為5。b=num2++;這是把num2++的值賦給b,因為自增運算符在變量的后面,所以先把num2賦值給b,b應該為8,然后num2自增加1變為 9。
那么如果出現這樣的情況我們怎么處理呢?
c=num1+++num2;
到底是c=(num1++)+num2;還是c=num1+(++num2);這要根據編譯器來決定,不同的編譯器可能有不同的結果。所以我們在以后的編程當中,應該盡量避免出現上面復雜的情況。

六、復合賦值運算符
在賦值運算符當中,還有一類C/C++獨有的復合賦值運算符。它們實際上是一種縮寫形式,使得對變量的改變更為簡潔。
Total=Total+3;
乍一看這行代碼,似乎有問題,這是不可能成立的。其實還是老樣子,'='是賦值不是等于。它的意思是本身的值加3,然后在賦值給本身。為了簡化,上面的代碼也可以寫成:
Total+=3;
復合賦值運算符有下列這些:
符號 功能
+= 加法賦值
-= 減法賦值
*= 乘法賦值
/= 除法賦值
%= 模運算賦值
<<= 左移賦值
>>= 右移賦值
&= 位邏輯與賦值
|= 位邏輯或賦值
^= 位邏輯異或賦值
上面的十個復合賦值運算符中,后面五個我們到以后位運算時再說明。
那么看了上面的復合賦值運算符,有人就會問,到底Total=Total+3;與Total+=3;有沒有區別?答案是有的,對于A=A+1,表達式A被計算了兩次,對于復合運算符A+=1,表達式A僅計算了一次。一般的來說,這種區別對于程序的運行沒有多大影響,但是當表達式作為函數的返回值時,函數就被調用了兩次(以后再說明),而且如果使用普通的賦值運算符,也會加大程序的開銷,使效率降低。

七、條件運算符
條件運算符(?:)是C語言中唯一的一個三目運算符,它是對第一個表達式作真/假檢測,然后根據結果返回兩外兩個表達式中的一個。
<表達式1>?<表達式2>:<表達式3>
在運算中,首先對第一個表達式進行檢驗,如果為真,則返回表達式2的值;如果為假,則返回表達式3的值。
例如:
a=(b>0)?b:-b;
當b>0時,a=b;當b不大于0時,a=-b;這就是條件表達式。其實上面的意思就是把b的絕對值賦值給a。

八、逗號運算符
在C語言中,多個表達式可以用逗號分開,其中用逗號分開的表達式的值分別結算,但整個表達式的值是最后一個表達式的值。
假設b=2,c=7,d=5,
a1=(++b,c--,d+3);
a2=++b,c--,d+3;
對于第一行代碼,有三個表達式,用逗號分開,所以最終的值應該是最后一個表達式的值,也就是d+3,為8,所以a=8。對于第二行代碼,那么也是有三個表達式,這時的三個表達式為a2=++b、c--、d+3,(這是因為賦值運算符比逗號運算符優先級高)所以最終表達式的值雖然也為8,但a2=3。

還有其他的如位邏輯運算符,位移運算符等等,我們等到講位運算時再說明。

九、優先級和結合性
從上面的逗號運算符那個例子可以看出,這些運算符計算時都有一定的順序,就好象先要算乘除后算加減一樣。優先級和結合性是運算符兩個重要的特性,結合性又稱為計算順序,它決定組成表達式的各個部分是否參與計算以及什么時候計算。
最后一次編輯時間 2008-07-25
wy448762577
wy448762577


wy448762577:c語言的左移運算符

temp=0x01; for(i=0;i<8;i++) { P1=~temp; delay(1500); temp<<=1; } 為什么計算出來的數據了 二進制 1111 1110 1111 1101 1111 1011 ..... 是不是把最前面的1拿到最后面,然后其他數據都前進... temp=0x01;
for(i=0;i<8;i++)
{
P1=~temp;
delay(1500);
temp<<=1;
}
為什么計算出來的數據了
二進制 1111 1110
1111 1101
1111 1011 .....
是不是把最前面的1拿到最后面,然后其他數據都前進一位?

加入上面正確的話,那為什么下面這個是正確的
temp=0x7F;
for(i=0;i<8;i++)
{
P1=temp;
delay(100);
temp>>=1;
}
他的答案是 二進制 0111 1111 ;0011 1111; 0001 1111。。。這樣的。
請問為什么啊
~temp只是求反并不改變temp本身的值,  可以詳細點跟我說下嘛?我看不懂!
下面的解答已被5796人點贊
1、用來將一個數的各二進制位全部左移若干位。
2、例如:
將a的二進制數左移2位,右補0。若a=15,即二進制數00001111,左移2位得00111100,即十進制數60(為簡單起見,用8位二進制數表示十進制數15,如果用16位二進制數表示,結果是一樣的)。
最后一次編輯時間 推薦于2017-10-05 19:42:39
胡椒就是我
胡椒就是我


胡椒就是我:C語言中,與2乘左移,與2除右移,這個是啥意思,求詳細解釋。!

下面的解答已被4323人點贊
這句話的意思就是: 對一個數實施左移操作=對這個數×2; 對一個數實施右移操作=對這個數÷2。

這個是計算機基本的二進制操作,因此不僅僅局限于C語言, 事實上絕大多數計算機編程語言都支持這個操作。

理解很容易:
一個(十進制的)數,在電腦里面都可以按二進制表示。 比如數字8, 二進制就是1000. 左移一位,1000 << 1 = 0001 0000 = 16, 因此就是=8×2;同理右移一位, 1000 >> 1 = 0100 = 4, 就是8÷2.

一個十進制a(這里先以正整數為例說明), 總可以表示成: a = a[n-1]*2^(n-1)+a[n-2]*2(n-2) + .... a[1]*2^1 + a[0]+2^0; 這里a[n-1]....a[0]的取值范圍就是0或1,就是一個二進制數各個位上權系數。 假設a[i] << k; a[i] -> a[i+k]; 它對整個數的貢獻值,從2^i -> 2^(i+k) = 2^i × 2^k, 二進制的每一位都這樣操作,因此這個數就被放大了2^k倍。當k=1的時候,就是×2;同理右移就是÷2^k.
最后一次編輯時間 推薦于2017-09-19 21:41:19
sparkyou
sparkyou


sparkyou:c語言移位運算符用在數組上疑問

arr[]={0xf0,0x0f,0xff,0x00};
arr[0]<<=1; //意思是0xf0左移一位arr[0]=0xe0,還是數組整體左移一位arr[0]=0x0f ????
下面的解答已被1222人點贊
arr[0] = 0xf0;
樓主只是被十六進制迷惑了而已。

如果我這樣寫呢?arr[] = {1, 2, 3, 4};
arr[0] <<= 1; 現在樓主還有疑問嗎?
都是一樣的,左移一位指的是arr[0]這個位置上的這個數字,左移一位,即被放大兩倍。

追問

就是arr[0]變成0xe0?

追答

不是的。
0xf0的二進制是1111 0000,左移一位以后是1 1110 0000
所以結果是0x1e0

追問

unsigned char不是最多8個位嗎?

追答

你給arr數組設定的類型是unsigned char而不是int?

追問

unsigned char

追答

恩,我想當然的意味是int了。既然是unsigned char,那么最高位就溢出了,結果是0xe0,你說的沒錯。

更多追問

最后一次編輯時間 2014-07-18
davidlovelucy
davidlovelucy


davidlovelucy:C語言中的左移和右移?

C語言中左移<<表示乘以2,右移>>表示除以2,這是由計算機工作原理導致的!但是要是7,二進制數為0111,右移一位得3.5,但是右移之后二進制數變成0011,是3。不一樣啊,怎模解釋呢??請教高手!
下面的解答已被922人點贊
移位操作符的兩個操作數必須是整型的。整個移位表達式的值的類型也是整型的,而且,左移位操作符與右移位操作符的運算并不對稱。
最后一次編輯時間 推薦于2017-09-09 23:39:37
金蟾捕鱼单机下载