1. 程式人生 > >c語言迴圈位移(數字,字串)

c語言迴圈位移(數字,字串)

C語言中沒有提供迴圈移位的操作符,但可以通過簡潔的方式實現迴圈移位
設一個運算元x有s位則迴圈左移n位的操作為:
(x << n) | (x >> (s - n));
同理右移n位位:
(x >> n) | (x << (s - n));
實際程式設計中可以用巨集定義實現迴圈移位:
#define ROTATE_LEFT(x, s, n) ((x) << (n)) | ((x) >> ((s) - (n)))
#define ROTATE_RIGHT(x, s, n) ((x) >> (n)) | ((x) << ((s) - (n)))

例如:
#include <stdio.h>
#define ROTATE_LEFT(x, s, n) ((x) << (n)) | ((x) >> ((s) - (n)))
#define ROTATE_RIGHT(x, s, n) ((x) >> (n)) | ((x) << ((s) - (n)))
int main()
{
unsigned int a;
scanf("%x", &a);
printf("%08x\n", a);
printf("%08x\n", ROTATE_LEFT(a, 8 * sizeof(int), 4));
printf("%08x\n", ROTATE_RIGHT(a, 8 * sizeof(int), 8));
return 0;
}

執行結果:

12345678 //原數

23456781 //移1位後

具體樣例:

設有資料  a=01111011,迴圈左移2位 正確結果: 11101101

 分步實現:

b=a>>(8-2) ;//用來得到正常左移丟失的位和迴圈移位後其正確位置 b="00000001";

a="a"<<2;//左移 a="11101100"

a=a|b; //a=11101101

 如果不是用中間變數一步實現: a=(a>>(8-2))|(a<<2);

 總長度N(8 16 32)

 迴圈左移n (a>>(N-n))|(a>>n)

 迴圈右移n (a<<(N-n))|(a>>n)

 C語言的位運算功能是其區別於其他大多數高階程式設計語言的特色之一,用它可以方便實現一些特殊功能,靈活掌握是用C程式編寫系統程式的基礎。

其他對位進行操作的還有位域法;

幾個對位操作的樣例如下:

#define SETBIT(REG,N) REG|=(1<<N) //對REG的N位置1
#define CLRBIT(REG,N) REG&=~(1<<N) //對REG的N位清零

#define INVBIT(REG,N) REG^=(1<<N) //對REG的N位取反

===================================================================================================================================

我們在C語言中常常碰到字串迴圈左右移位的題型,下面對其進行詳解:

例如:有一組char的字串:abcdefghijk 。你要迴圈左移3位變成ijkabcdefgh(也有寫出ijkabcdefghi);或右移三位變成defghijkabc(也有寫成cdefghijkabc);

首先我們來解決字串迴圈右移的問題:

方法一:利用已有的字串函式。

#include<stdio.h>

#include<string.h>

void rightloop(char *a, int n);

main()

{

char a[100]; int n;

printf("請輸入要迴圈的字串:/n");

scanf("%s",a);

printf("請輸入要迴圈字串的位數:/n");

scanf("%d",&n); //以上程式碼也可以直接賦初值,我考慮的是一般情況//

void rightloop(a,n); //本例以a[]="abcdefghijk", n=3為例講解//

printf("輸出迴圈右移的字串:%s/n",a);

}





void rightloop(char *a, int n)

{

char b[100]; //陣列b要做的夠大即可//

int m;

m=strlen(a)-n; //求出除去要迴圈右移之後剩下的字元的個數//

strcpy(b,a+n); // a+n,a代表a[0]的地址再加上n,表示要把a[n]之後的字串(即那些不用迴圈右移的字元,共有m個)複製到陣列b中。這時b[]="defghijk"。 //

strcpy(b+m,a); // b+m, 因為上面已經把沒有迴圈的m個字元賦給了b,所以b[m]之前的不能在賦值了,只能把a的全部字串賦給b[m]之後的空間了。這時b[]="defghijkabcdefghijk"。//

*(b+strlen(a))='/0'; //這裡是問題的關鍵,要根據a字串的長度來捨棄b陣列中多餘的字串,並給數 組b加結束符。這時b[]="defghijkabc";//

strcpy(a,b); //把陣列b中調整好的字串重新賦給陣列a。//

}

方法二:就是用簡單的c語句;

#include<stdio.h>

void rightloop(char , int )

main()

{

char a[100]; int n;

printf("請輸入要迴圈的字串:/n");

scanf("%s",a);

printf("請輸入要迴圈字串的位數:/n");

scanf("%d",&n); //以上程式碼也可以直接賦初值,我考慮的是一般情況//

void rightloop(a,n); //本例以a[]="abcdefghijk", n=3為例講解//

printf("輸出迴圈右移的字串:%s/n",a);

}







void rightloop(char a[ ], int n)

{

int i=0,j=0,k=0;

int m; char b[100];

while(a[i]!='/0')

{ i++; } //這裡用i來計算陣列a中字串的大小;//

while(a[n]!='/0')

{

b[j]=a[n]; j++; n++;

} //這裡是把不需要迴圈右移的字串賦值到陣列b中;b[ ]="defghijk"。//

while(a[k]!='/0')

{

b[j]=a[k]; j++; k++;

} //因為上一個while迴圈中,陣列b已經賦值到b[j]了。所以這裡直接從b[j]開始把陣列a中的字串全部賦值到陣列b[j]以後的空間中;b [ ]="defghijkabcdefghijk";//

b[i]='/0'; //通過用陣列a中字串的長度i來調整陣列b的長度,刪去陣列b中多餘的字串 ,b[]="defghijklabc"。

for(i=0;b[i]!='/0';i++)

{ a[i]=b[i]; } //把陣列b中調整好的字串重新賦給陣列a。//

}





再次我們來解決字串迴圈左移的問題

方法一:呼叫已經有的字串函式。



#include<stdio.h>

#include<string.h>

void leftloop(char *a, int n);

main()

{

char a[100]; int n;

printf("請輸入要迴圈的字串:/n");

scanf("%s",a);

printf("請輸入要迴圈字串的位數:/n");

scanf("%d",&n); //以上程式碼也可以直接賦初值,我考慮的是一般情況//

void leftloop(a,n); //本例以a[]="abcdefghijk", n=3為例講解//

printf("輸出已經迴圈左移的字串:%s/n",a);

}

void leftloop(char*a,int n)

{char b[100]; //陣列b要做的夠大即可//

int m;

m=strlen(a)-n; //求出除去要迴圈右移之後剩下的字元的個數//

strcpy(b,a+m); // a+m,a代表a[0]的地址再加上m,表示要把a[m]之後的字串(即那些需要迴圈左移的字元,共有n個)複製到陣列b中。這時b[]="ijk"。 //

strcpy(b+n,a); // b+n, 因為上面已經把需要迴圈的n個字元賦給了b,所以b[n]之前的不能在賦值了,只能把a的全部字串賦給b[n]之後的空間了。這時b[]="ijkabcdefghijk"。//

*(b+strlen(a))='/0'; //這裡是問題的關鍵,要根據a字串的長度來捨棄b陣列中多餘的字串,並給陣列b加結束符。這時b[]="ijkabcdefgh";//

strcpy(a,b); //把陣列b中調整好的字串重新賦給陣列a。//

}

方法二:就是用簡單的c語句;#include<stdio.h>

void leftloop(char , int )

main()

{

char a[100]; int n;

printf("請輸入要迴圈的字串:/n");

scanf("%s",a);

printf("請輸入要迴圈字串的位數:/n");

scanf("%d",&n); //以上程式碼也可以直接賦初值,我考慮的是一般情況//

void leftloop(a,n); //本例以a[]="abcdefghijk", n=3為例講解//

printf("輸出已經迴圈左移的字串:%s/n",a);

}











void leftloop(char a[ ], int n)

{

int i=0,j=0,k;

int m; char b[100];

while(a[i]!='/0')

{ i++; } //這裡用i來計算陣列a中字串的大小;//

k=m=i-n; //計算出前面有多少個字元不用移動//

while(a[k]!='/0')

{

b[j]=a[k]; j++; k++;

} //因為這時k=i-m,a[k]表示需要迴圈移動的第一個字元,這裡是把需要迴圈右移的字串賦值到陣列b中;b[ ]="ijk"。//



b[j]='/0';

m--;k--; //因為要用m調節下面的迴圈但是要從0開始所以比實際的多了一次;k--是為了要留著陣列a中的結束符,不出現亂碼;//

while(m>=0)

{

a[k]=a[m]; m--; k--;

} // 原來a[k]=“abcdefghijk",a[m]="abcdefgh",賦值之後a[k]="abcabcdefgh";//





for(i=0;b[i]!='/0';i++)

{ a[i]=b[i]; } //把陣列b中調整好的字串重新賦給陣列a。b[i]="ijk";a[i]="abcabcdefgh"。賦值之後a[i]="j//

}

相關推薦

c語言迴圈位移數字字串

C語言中沒有提供迴圈移位的操作符,但可以通過簡潔的方式實現迴圈移位 設一個運算元x有s位則迴圈左移n位的操作為: (x << n) | (x >> (s - n)); 同理右移n位位: (x >> n) | (x << (s

數字字元字串轉int陣列

1,舉例 字元字串轉成int陣列,存入int陣列,並進行遍歷。 Scanner input=new Scanner(System.in); System.out.println(“請輸入只含有大小寫的字串”); String string=input.next(

C語言條件編譯#if#ifdef#ifndef#endif#else#elif

1、條件編譯介紹 條件編譯(conditional compiling)命令指定前處理器依據特定的條件來判斷保留或刪除某段原始碼。例如,可以使用條件編譯讓原始碼適用於不同的目標系統,而不需要管理該原始碼的各種不同版本。 條件編譯區域以 #if、#ifdef 或 #ifndef 等命令作為開頭,以

c語言小題目數字整除。。。2014.5.23

定理:把一個至少兩位的正整數的個位數字去掉,再從餘下的數中減去個位數的5倍。當且僅當差是17的倍數時,原數也是17的倍數 。 例如,34是17的倍數,因為3-20=-17是17的倍數;201不是17的倍數,因為20-5=15不是17的倍數。輸入一個正整數n,你的任務是判斷它是否是17的倍數。

1098: C語言程式設計教程第三版課後習題10.5---有n人圍成一圈順序排號。從第1個人開始報數從1到3報數凡報到3的人退出圈子問最後留下的是原來的第幾號的那位。

題目描述 有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來的第幾號的那位。 輸入 初始人數n 輸出 最後一人的初始編號 樣例輸入 3 樣例輸出 2 提示 來源 思路點撥:定義一個數組,陣列下標表示人的編號,若數組裡面的

1079: C語言程式設計教程第三版課後習題8.2---求方程 的根用三個函式分別求當b^2-4ac大於0、等於0、和小於0時的根並輸出結果。從主函式輸入a、b、c的值。【兩種方法】

題目描述 求方程 的根,用三個函式分別求當b^2-4ac大於0、等於0、和小於0時的根,並輸出結果。從主函式輸入a、b、c的值。 輸入 a b c 輸出 x1=? x2=? 樣例輸入 4

C 語言異常處理五十二

異常處理 C 中的異常處理 if...else... setjmp() longjmp() 我們今天來看下異常處理,在看 C++ 的異常處理之前,先來看看 C 語言中的異常處理。那麽什麽是異常呢?在程序運行過程中可能會產生異常,異常(Exception)與 Bug 的區別是

一個博客萌新的C語言之旅持續更新中....

方便 流程 函數聲明 語言 tex 表達 賦值語句 當前 寫在前面 先更新上一次留下的的C語言練習答案,如下: #include <stdio.h> double mj(double r) { return 3.14*r*r; } int main() { i

一個部落格萌新的C語言之旅持續更新中....

先更新上一次留下的的C語言練習答案,如下: #include <stdio.h> double mj(double r) { return 3.14*r*r; } int main() { int r; double s; r=3; s=mj(r); printf("%f",s); }

1012 - C語言程式設計教程第三版課後習題6.2

1012 - C語言程式設計教程(第三版)課後習題6.2 時間限制:1秒 記憶體限制:128兆 題目描述 輸入一行字元,分別統計出其中英文字母、空格、數字和其他字元的個數。 輸入 一行字元 輸出 統計值 樣例輸入 aklsjflj123 sadf918u324 asdf91u32oa

1011 - C語言程式設計教程第三版課後習題6.1

1011 - C語言程式設計教程(第三版)課後習題6.1 時間限制:1秒 記憶體限制:128兆 題目描述 輸入兩個正整數m和n,求其最大公約數和最小公倍數。 輸入 兩個整數 輸出 最大公約數,最小公倍數 樣例輸入 5 7 樣例輸出 1 35 最大公約數求法我是用的是輾轉相除法進行

1010 - C語言程式設計教程第三版課後習題5.8

1010 - C語言程式設計教程(第三版)課後習題5.8 時間限制:1秒 記憶體限制:128兆 題目描述 企業發放的獎金根據利潤提成。利潤低於或等於100000元的,獎金可提10%; 利潤高於100000元,低於200000元(100000<I≤200000)時,低於100000元的部

1047 - C語言程式設計教程第三版課後習題10.5

1047 - C語言程式設計教程(第三版)課後習題10.5 時間限制:1秒 記憶體限制:128兆 題目描述 有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來的第幾號的那位。 輸入 初始人數n 輸出 最後一人的初始編號 樣例輸入

1022 - C語言程式設計教程第三版課後習題7.1

1022 - C語言程式設計教程(第三版)課後習題7.1 時間限制:1秒 記憶體限制:128兆 題目描述 用篩法求之N內的素數。 輸入 N 輸出 0~N的素數 樣例輸入 100 樣例輸出 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

1008 - C語言程式設計教程第三版課後習題5.6

1008 - C語言程式設計教程(第三版)課後習題5.6 時間限制:1秒 記憶體限制:128兆 題目描述 給出一百分制成績,要求輸出成績等級‘A’、‘B’、‘C’、‘D’、‘E’。 90分以上為A 80-89分為B 70-79分為C 60-69分為D 60分以下為E 輸入 一個整數0

1007 - C語言程式設計教程第三版課後習題5.5

007 - C語言程式設計教程(第三版)課後習題5.5 時間限制:1秒 記憶體限制:128兆 描述 有一個函式 y={ x x<1 | 2x-1 1<=x<10 \ 3x-11 x>=10 寫一段程式,輸入x,輸出y 輸入 一個數x 輸出 一個數y 樣例輸

1006 - C語言程式設計教程第三版課後習題5.4

1006 - C語言程式設計教程(第三版)課後習題5.4 時間限制:1秒 記憶體限制:128兆 描述 有三個整數a b c,由鍵盤輸入,輸出其中的最大的數。 輸入 一行陣列,分別為a b c 輸出 a b c其中最大的數 樣例輸入 10 20 30 樣例輸出 30 提示 max ?

1005 - C語言程式設計教程第三版課後習題4.9

1005 - C語言程式設計教程(第三版)課後習題4.9 時間限制:1秒 記憶體限制:128兆 題目描述 輸入一個華氏溫度,要求輸出攝氏溫度。公式為 c=5(F-32)/9 輸出要求有文字說明,取位2小數。 輸入 一個華氏溫度,浮點數 輸出 攝氏溫度,浮點兩位小數 樣例輸入 -4

1003 - C語言程式設計教程第三版課後習題3.7

1003 - C語言程式設計教程(第三版)課後習題3.7 時間限制:1秒 記憶體限制:128兆 提交 題目描述 要將"China"譯成密碼,譯碼規律是:用原來字母后面的第4個字母代替原來的字母.例如,字母"A"後面第4個字母是"E".“E"代替"A”。因此,“China"應譯

1002 - C語言程式設計教程第三版課後習題1.6

1002 - C語言程式設計教程(第三版)課後習題1.6 時間限制:1秒 記憶體限制:128兆 題目描述 編寫一個程式,輸入a、b、c三個值,輸出其中最大值。 輸入 一行陣列,分別為a b c 輸出 a b c其中最大的數 樣例輸入 10 20 30 樣例輸出