C語言運算子的運用
阿新 • • 發佈:2018-12-17
-
第一個問題
1、編寫函式: unsigned int reverse_bit(unsigned int value); 這個函式的返回值value的二進位制位模式從左到右翻轉後的值。 如: 在32位機器上25這個值包含下列各位: 00000000000000000000000000011001 翻轉後:(2550136832) 10011000000000000000000000000000 程式結果返回: 2550136832
- //reverse <<= 1;
- //reverse |= (num >> bit) 關鍵步驟
1、reverse向右移動,如0000 0000 0000 0000
2、num>>bit 這裡是取num的每一個二進位制的值,如25 0000 0000 0001 1001 &1就是取第一位
3、然後或給reverse reverse就成了0000 0000 0000 0001
4、回到第一步,reverse右移,reverse 0000 0000 0000 0010 ——> 0000 0000 0000 0011
5、總共移動32次就翻轉完成
//C語言 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> void reverse_bit(unsigned int num) { int com = 31; printf("%u的二進位制為:",num);//為了美觀,可以省略 while (com>=0) { printf("%u",(num>>com)&1);//這裡,num向右移位,然後&1,取每一個二進位制的值,一共移位32位。 //有因為第一位也要&1,所以com從0開始。因為num是固定的,所以 //com才要迴圈。知道>>很容易理解。 --com; } printf("\n"); printf("%u翻轉後的二進位制為:",num); unsigned int reverse = 0; for (unsigned int bit = 0; bit < 32; ++bit) {//重點 reverse <<= 1; //這裡的reverse向右移動來儲存num的值。 reverse |= (num >> bit) & 1;//這裡不好理解,程式碼塊外面解答 printf("%d",reverse&1);//這裡就是列印二進位制的值 } printf("\n"); printf("現在的數為:%u\n",reverse); } void main() { unsigned int input = 0; while (1) { printf("請輸入一個非負整數:"); scanf("%d",&input); if (input<0) { printf("輸入有誤,請重新輸入!"); continue; } reverse_bit(input); break; } system("pause"); }
-
第二個問題
2.程式設計實現: 一組資料中只有一個數字出現了一次。其他所有數字都是成對出現的。 請找出這個數字。(使用位運算)
這裡使用異或運算子。
^:不同為1 ,相同為0
它的特點就是異或一個數兩次等於沒有異或。
如{ 1 , 2 ,2 ,3 ,3} 二進位制就是{ 01, 10 ,10 ,11 ,11}
然後 1^2-->01^10-->11-->11^10-->01-->01^11-->10-->10^11-->01
這樣就找到了單獨的數
//C語言 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> void main() { int arr[9] = { 1,3,5,4,6,6,5,3,4 }; int temp = 1; while (temp<9) { arr[0] = arr[0] ^ arr[temp];//01 11 10 /10 11 01 /001 100 000/ 101 100 001 ++temp; } printf("單神數是%d\n",arr[0]); system("pause"); }