c語言移位

c語言移位

平臺用戶的互動中精選與c語言移位相關的:1、C語言中怎樣表示移位?例如將某個值左移兩位 2、C語言按位左移運算規則 3、C語言 左移 右移的問題 << 或 >> 4、c語言,移位運算符>> 5、C語言中 移位 和 按位 和 +-*/ 的優先級是怎么樣的 6、C語言中 <<移位是否有次數限制? 7、C語言左移 8、C語言中左移運算符的問題 9、C語言中 有關移位時的問題 10、C語言 左移位的問題,求大神,幫忙解釋一下。!
c語言移位
平臺用戶 2018-06-06 16:59:10

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

知道手機網友
知道手機網友


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

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

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

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


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

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

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
弄月公子R
弄月公子R


弄月公子R:C語言 左移 右移的問題 << 或 >>

一個數左移以后,賦值給別的變量,這個數變化了沒有,如果再進行一次左移,是對原來的數左移,還是在第一次左移的基礎上移動 例 a=ox32 (16進制) 0011 0010 b=a<<2 這個時候b=1100 1000 對不對 那么此時a=? 繼續 c=a<<2 請問c是在原來a的初值... 一個數左移以后,賦值給別的變量,這個數變化了沒有,如果再進行一次左移,是對原來的數左移,還是在第一次左移的基礎上移動
例 a=ox32 (16進制) 0011 0010
b=a<<2
這個時候b=1100 1000 對不對
那么此時a=?

繼續
c=a<<2
請問c是在原來a的初值(ox32)上移動
還是在b的基礎上移動

回答越詳細越好,
好的 必定加分
此時c=?
b=?
a=?
下面的解答已被5085人點贊
左移 右移不會修改a本身

a=ox32 (16進制) 0011 0010
b=a<<2
這個時候b=1100 1000 對
那么此時a=0011 0010

繼續
c=a<<2
請問c是在原來a的初值(ox32)上移動
這個時候c=1100 1000
最后一次編輯時間 推薦于2017-11-24 11:58:40
我有新問題
我有新問題


我有新問題:c語言,移位運算符>>

void main()
{
short a=0xf245,b;
b=a>>8;
printf("....".......)
}
請問為什么b=0xfff2,而不是0x00f2
下面的解答已被2610人點贊
右移對符號位的處理和左移不同,對于有符號整數來說,比如int類型,右移會保持符號位不變,例如:10100110 >>5(假設字長為8位),則得到的是 11111101。

總之,在C中,左移是邏輯/算術左移(兩者完全相同),右移是算術右移,會保持符號位不變.實際應用中可以根據情況用左/右移做快速的乘/除運算,這樣會比循環效率高很多.

所以,short a=0xf245,即a=1111001001000101,經過右移后,b=a>>8;b=1111111111110010,即b=0xfff2。注意是有符號右移為算術右移。!

追問

誰能告訴我,為什么f245是負的,明明是正的嘛,他又不是-f245

追答

short a=0xf245,即a=1111001001000101,符號位為1,就是負數,負數在計算機內以補碼形式存在,而不是-f245這個形式。你可以查看補碼等知識

最后一次編輯時間 推薦于2017-10-06 19:08:54
binlaniua
binlaniua


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

下面的解答已被1031人點贊
下面是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
莽撞地闖入
莽撞地闖入


莽撞地闖入:C語言中 <<移位是否有次數限制?

下面的解答已被7880人點贊
沒有限制,但C語言最大的存儲類型是long long和double,即64位,如果<<大于64就一定是0了。所以這個問題沒什么意義

追問

我在單片機程序里用<<移位,用一個變量記錄到CY的值,結果循環不起來,就懷疑是不是有限制。謝謝你的回答,我的問題昨天解決了。a=(a<<1)|(a>>2);這樣實現了循環

最后一次編輯時間 推薦于2016-10-03 13:52:08
271768603
271768603


271768603:C語言左移

#define RW_CIRCCTL 0xF4 #define PIECCALIGN (1 << 7) // PI Error Count Aligned ECC #define CDERRCNT_01 (0 << 6) // 1 Sector Error Cal Interval #define CDERRCNT_75 (1 << 6) // 75 Sector Error Ca... #define RW_CIRCCTL 0xF4
#define PIECCALIGN (1 << 7) // PI Error Count Aligned ECC
#define CDERRCNT_01 (0 << 6) // 1 Sector Error Cal Interval
#define CDERRCNT_75 (1 << 6) // 75 Sector Error Cal Interval
#define DVDERRCNT_01 (0 << 6) // 1 ECC Error Cal Interval
#define DVDERRCNT_42 (1 << 6) // 42 Sector Error Cal Interval
#define PI_FRMERR (0 << 5) // PI frame error number
#define PI_ERROR (1 << 5) // PI error number
#define C1C2_NOSFRMERR (0 << 5) // C1/C2 no solution frame
#define C1C2_FRMERR (1 << 5) // C1/C2 frame error number

程序中,左移怎么實現的?0左移5位和左移6位有什么區別?
下面說的我都知道,我主要是想知道為什么要那樣寫?0 << 5    0 << 6    5  6 代表什么含義,
下面的解答已被3420人點贊
0<<5左移5位,即000000
0<<6左移6位,即0000000
左移后是用二進制表示的,
具體的這個程序中有什么用,應該看程序本身,
就像#define PI_FRMERR (0 << 5)
用000000代替PI_FRMERR可能與某個數進行與操作或其他的。
最后一次編輯時間 推薦于2017-09-03 07:26:14
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個運行結果也是完全不懂,麻煩高手詳細解釋一下啊
下面的解答已被5274人點贊
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
dengtao250
dengtao250


dengtao250:C語言中 有關移位時的問題

CPU是32位的芯片 現在 unsigned char A,A=0x06; ;(8<<A)&0xFFFF 是否有位的丟失; 為什么? 因為我考慮 A是UC 的 是8位 左移8位后,會變成0x0600;這樣實際上高位 06不是丟了嗎 ?(8<<A)&0xFFFF的值不就只是0 嗎 ?請問我的考慮是否有道理 ... CPU是32位的芯片 現在 unsigned char A,A=0x06; ;(8<<A)&0xFFFF 是否有位的丟失; 為什么? 因為我考慮 A是UC 的 是8位 左移8位后,會變成0x0600;這樣實際上高位 06不是丟了嗎 ?(8<<A)&0xFFFF的值不就只是0 嗎 ?請問我的考慮是否有道理 求高手解
下面的解答已被5012人點贊
32位的芯片,位移操作的處理是這樣的:
左移時移出的高位全部丟棄,低位全補0,所謂移出的高位是指超過32位,即4個字節后會丟棄;
右移時,移出的位數全部丟棄,對于無符號數,則高位補0;對于有符號數,則符號位補0還是1,不確定。

另外說一點,你的代碼中8<<A這個表達式,意思是把8左移6位,而不是6左移8位。
最后一次編輯時間 推薦于2016-09-07 21:49:44
cc小火車
cc小火車


cc小火車:C語言 左移位的問題,求大神,幫忙解釋一下。!

int aa=0x12;
pitntf("%d\n",aa<<3);
應該等于96的為什么是90,要是移4位,應該192,但輸出是120。!
幫忙解釋一下。。。。謝謝
下面的解答已被4210人點贊
aa==0x12(0x表示十六進制,十六進制12,十進制是16+2==18),二進制0001 0010

左移3位,二進制1001 0000,十六進制0x90,十進制144。
左移4位,二進制0001 0010 0000,十六進制0x120,十進制288。
你確定是printf("%d\n",aa<<3);嗎?可能是這個吧:printf("%x",aa<<3);,%x表示十六進制輸出。
最后一次編輯時間 推薦于2018-03-31 11:30:02
金蟾捕鱼单机下载 内蒙古快3形态走势一定牛 浙体育彩票6十1开奖号 当前最好的理财产品 大公鸡七星彩手机版 福彩3d历史开奖查询 中融国通股票配资公司 黑龙江体彩11选5推荐号码 安装中国福利彩票软件 股票指数是什么东西 福建十一选五基本走