1. 程式人生 > >C語言 二進位制左右移運算小程式

C語言 二進位制左右移運算小程式

#include <stdlib.h> ////呼叫itoa();
#include <stdio.h>



 int convert1(int , int );
int convert2(int , int );

int main()
{
    int i; 
    int z; 
    int m; 
    int x; 
    char L; 
    char R; 
    char s[128]; 
    printf("請輸入需操作的十進位制\n"); 
    scanf("%d",&i);
    printf("請輸入需要移動的位數\n"
); scanf("%d", &m); getchar(); while(i != 0) { printf("請選擇左移(輸入L)或右移(輸入R)\n"); switch(getchar()) { case 'L': z = convert1( i, m); itoa(z, s, 2); printf("該數左移後為二進位制是: [%s]\n",s); break; case 'R': x = convert2(i, m); itoa(x, s, 2
); printf("該數右移後為二進位制是: [%s]\n",s); break; default: printf("unvalid command"); break; } printf("請繼續輸入:\n"); printf("請輸入需操作的十進位制\n"); scanf("%d",&i); printf("請輸入需要移動的位數\n"); scanf("%d", &m); getchar(); } } int
convert1(int a, int n) { return( a<<n); } int convert2(int a, int n) { return( a>>n); }

/* 列印結果
請輸入需操作的十進位制
40
請輸入需要移動的位數
3
請選擇左移(輸入L)或右移(輸入R)
L
該數左移後為二進位制是: [101000000]
請繼續輸入:
請輸入需操作的十進位制
40
請輸入需要移動的位數
1
請選擇左移(輸入L)或右移(輸入R)
R
該數右移後為二進位制是: [10100]
請繼續輸入:
請輸入需操作的十進位制

*/

總結(來自網路):
計算機的算術左移和邏輯左移相同,這個是正確的.
只有算術右移和邏輯右移是不同.
算術左移好像會把負的數變成正的,這句話不正確

如果把0000 1000左移四位,那最高位是不是變成1了,不就變成負的了?
這句話說對也對,說不對也沒錯 對的情況下是,如果計算機的字長剛好是8位的話,那麼0000 1000 左移4位後 就變成了1000 0000 就變成了負數 錯的情況下是,如果計算機的字長超過8位,那麼0000 1000 左移4位後, 變成了0000 1000 0000 ,數值增大了16倍. 並沒有變成負數