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