⑴ c語言中負數位運算規則是怎樣的
跟正數一樣,但有一個不同,就是右移運算,負數右移高位補1,正數右移高位補0
⑵ C程序中,左移「<<」、右移「>>」 的具體用法是什麼
C語言中,「<<」為左移運算符,「>>」為右移運算符。
具體使用方法如下:
1、左移運算符(<<)
將一個運算對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)。
例:a = a << 2 將a的二進制位左移2位,右補0,
左移1位後a = a * 2;
若左移時舍棄的高位不包含1,則每左移一位,相當於該數乘以2。
2、右移運算符(>>)
將一個數的各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。
操作數每右移一位,相當於該數除以2。
例如:a = a >> 2 將a的二進制位右移2位。
左補0 or 補1 得看被移數是正還是負。
⑶ C語言問題,有關負數的循環移位
#include<stdio.h>
int main()
{int x=-1024,n=4,i;
printf("x=%d ",x);
for(i=31;i>-1;i--)
{printf("%d",(x>>i)&1);
if(i%4==0)printf(" ");
}
for(i=1;i<=n;i++)
x=((x&0x8000000)!=0)|(x<<1);
printf(" 循環左移%d位以後,x=%d ",n,x);
for(i=31;i>-1;i--)
{printf("%d",(x>>i)&1);
if(i%4==0)printf(" ");
}
return 0;
}
⑷ 關於C語言負整數移位運算的問題。
#include<stdio.h>
voidShow(shortn){
shorti;
printf("%d(",n);
for(i=0;i<16;++i)
printf("%d",(n&(1<<(15-i)))>>(15-i));
printf(")B
");
}
intmain(void){
shortn=-1280;
printf("左移時,末位補0,右移時,首位補1。
");
Show(n);
printf("左移4位後:");
Show(n<<4);
printf("右移4位後:");
Show(n>>4);
return0;
}
⑸ c語言中負數除法和右移的區別
對於無符號整數,除法和右移效果是一樣的;
對於有符號的正整數,除法和右移的效果也是一樣的;
對於有符號的負整數,除法和右移的效果是不一樣的;
比如:-3/2 = -1;-3>>1是多少呢?
我們可以將其按照8位二進制展開-3的8位二進制是1000 0011,負數在計算機中是以補碼的形式存儲的,所以還需要將其轉換成補碼1000 0011
轉換成反碼 1111 1100(最高位符號位不動), 再加1轉換成補碼1111 1101
接著將其右移1位,由於是有符號負整數,所以最高位補1,變為1111 1110
接著將其還原成原碼,1111 1110減1變反碼1111 1101,接著反碼取反變原碼1000 0010,轉換成十進制是-2,
也就是說-3>>1得到的是-2
其實這是因為 除法是向0取整,而右移位是向負取整
-3/2=-1.5=-1(向0取整),-3>>1=-1.5=-2(向負取整);
如果我們需要右移達到的效果和除法一樣,可以採取下列公式:
假設除數為2^N,負數x的除法可以用以下方法來代替:(x + 2^N - 1) >> N
本文來自 西門一雪 的CSDN 博客 ,全文地址請點擊: https://blog.csdn.net/liubo_10184653/article/details/80500418?utm_source=
⑹ 在c語言中,負數向右移動1位也算是除以2嗎
在c語言中,負的偶數向右移動1位也是除以2,負的奇數向右移動1位等於此數除以2,再減1。
⑺ C語言帶符號數的左移右移搞不清楚
帶符號數的左移右移和不帶符號的一樣,區別就是用最高為來表示符號位 , 1表示負,0表示正
-1就是10000000 00000000 00000000 00000001
1就是00000000 00000000 00000000 00000001
⑻ 位運算:負數右移與無符號右移運算小結
該作者講述的很詳細。
對於帶符號右移,若為負數,則在存儲時首位表示符號位,其值為1,表示該值是負數的移位,在移位過程中,高位補1,若符號位是0,表示是正數,在移位過程中高位補零,兩者的前提是符號位保持不變:
對於負數的右移:因為負數在內存中是以補碼形式存在的,所有首先根據負數的原碼求出負數的補碼(符號位不變,其餘位按照原碼取反加1),然後保證符號位不變,其餘位向右移動到X位,在移動的過程中,高位補1.等移位完成以後,然後保持符號位不變,其餘按位取反加1,得到移位後所對應數的原碼。即為所求。
舉例1:
-100帶符號右移4位。-100二進制轉換為:1100100
-100原碼: 10000000 00000000 00000000 01100100
-100補碼: 保證符號位不變,其餘位置取反加1
11111111 11111111 11111111 10011100
右移4位 : 在高位補1
11111111 11111111 11111111 11111001
補碼形式的移位完成後,結果不是移位後的結果,要根據補碼寫出原碼才是我們所求的結果。其方法如下:
保留符號位,然後按位取反
10000000 00000000 00000000 00000110
然後加1,即為所求數的原碼:
10000000 00000000 00000000 00000111
所有結果為:-7
舉例2:
-100無符號右移4位。
-100原碼: 10000000 00000000 00000000 01100100
-100補碼: 保證符號位不變,其餘位置取反加1
11111111 11111111 11111111 10011100
無符號右移4位 : 在高位補0
00001111 11111111 11111111 11111001
即為所求:268435449
總結:
負數的無符號右移就是相應的補碼移位所得,在高位補0即可。
負數的右移,就是補碼高位補1,然後按位取反加1即可。
---------------------
原文:https://blog.csdn.net/king_msky/article/details/17221973