編寫一個函數,對一個16位的二進制數取出它的奇數位(即從左邊起,第1,3,5,...,15位)。


1.先貼我的代碼,VC6.0開發環境下去掉第5行。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 int main(){  5     setvbuf(stdout,NULL,_IONBF,0);  6     int value;  7     int getodds(int value);  8 
 9     printf("Input the value:"); 10     scanf("%o",&value); 11 
12     printf("The result is %o.",getodds(value)); 13 
14     return EXIT_SUCCESS; 15 } 16 
17 int getodds(int value){ 18     int result=0; 19     int i; 20     int t; 21     for(i=0;i<8;i++) 22  { 23         t=1<<(2*i+1); 24         result=result+((value&t)>>(i+1)); 25  } 26     return result; 27 }

我的思路是這樣的:

把二進制數的奇數位,共8位,依次存放到另一個二進制數的后8位中。解釋如下:

從后往前,每次取二進制數奇數位中的1位,將得到的數分別右移若干位,循環8次,將每次右移后的數相加即可。

1).  xxxx  xxxx  xxxx  xxxx

&   0000  0000  0000  0010  1<<1

     0000  0000  0000  00x0

     0000  0000  0000  000x  右移1位

2).  xxxx  xxxx  xxxx  xxxx

&   0000  0000  0000  1000  1<<3

     0000  0000  0000  x000

     0000  0000  0000  00x0  右移2位

3).  xxxx  xxxx  xxxx  xxxx

&   0000  0000  0010  0000  1<<5

     0000  0000  00x0  0000

     0000  0000  0000  0x00  右移3位

……循環8次,將每次的和相加,即為最后的值。

        循環變量i    0 1 2 3 4……

       1左移的次數      1 3 5 7 9……  2*i+1

相與后的數右移的次數 1 2 3 4 5……  i+1

2.再貼上譚浩強的思路:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<math.h>
 4 
 5 int main(){  6     setvbuf(stdout,NULL,_IONBF,0);  7     unsigned short value;  8     unsigned short getodds(unsigned short);  9 
10     printf("Input the value:"); 11     scanf("%o",&value); 12 
13     printf("The result is %o.",getodds(value)); 14 
15     return EXIT_SUCCESS; 16 } 17 
18 unsigned short getodds(unsigned short value){ 19     unsigned short result=0; 20     int i; 21     unsigned short a,b,c,power; 22     for(i=0;i<8;i++) 23  { 24 
25         power=pow(2,7-i); 26         a=value>>(15-2*i); 27         b=a<<15; 28         c=b>>15; 29         result=result+c*power; 30  } 31     return result; 32 }

這個解法的思路是這樣的,依次取出奇數位的值,再乘以相應的權重,然后將每次的值相加。

比如,

取第1位的值是這樣的,將二進制數右移15位,第1位的值就到了最后1位,然后將二進制數左移15位,再右移15位,所得的數就是第1位的值了,1或者0,再乘以權重2**7;

第3位,將二進制數右移13位,第3位的值就到了最后1位,然后將二進制數左移15位,再右移15位,所得的數就是第3位的值了,1或者0,再乘以權重2**6;

依次類推。先左移15位,再右移15位的目的是將除要取出的位之外的其它位變為0。

這個算法必須用短整型,剛開始我在我的代碼上按照譚浩強的算法進行修改之后,一直出不來正確結果,調試半天,發現必須用短整型。我的算法不存在這個問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM