1. 程式人生 > >C語言運算子的運用

C語言運算子的運用

  • 第一個問題

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");
}