#27039: c 位元運算


howardchen1222@gmail.com (hao pry)

School : No School
ID : 151289
IP address : [49.216.222.67]
Last Login :
2021-11-27 10:23:19
a414. 位元運算之進位篇 -- c910335 | From: [49.216.221.197] | Post Date : 2021-09-08 19:07

將n轉換成二進位

從低位位元開始看

數有幾個連續的1

即答案

ex:

17 ---> 10001

右邊數過來只有一個連續的1

ans :1

使用&運算子跟1比較即可知道最低位元是否為1

使用>>運算子可將數字往右位移 左邊補0

ex:

(10001>>1) == 01000

(實際上不只5個位元 左邊還有26個位元)

 
#27040: Re:c 位元運算


howardchen1222@gmail.com (hao pry)

School : No School
ID : 151289
IP address : [49.216.222.67]
Last Login :
2021-11-27 10:23:19
a414. 位元運算之進位篇 -- c910335 | From: [49.216.221.197] | Post Date : 2021-09-08 19:10

int count=0;
int i=0;
while((n>>i)){
if((n>>i) & 0x1){
    count++;
else {
    break;
}
 i++;
}
使用位元運算來計算此題



 
#27042: Re:c 位元運算


406490150@gms.tku.edu.tw (我是朱朱)

School : 國立交通大學
ID : 139794
IP address : [140.113.236.122]
Last Login :
2021-10-14 15:49:00
a414. 位元運算之進位篇 -- c910335 | From: [1.172.246.19] | Post Date : 2021-09-09 00:08

int count=0;
int i=0;
while((n>>i)){
if((n>>i) & 0x1){
    count++;
else {
    break;
}
 i++;
}
使用位元運算來計算此題




你好,感謝你分享解題方向與程式碼片段,很棒的想法

我從你的程式碼看見了一些我認為可以精進的地方,想與你分享:

  • count與int的計數方式相同,具有相同的值,可以捨棄其中一個變數,減少無用變數
  • while迴圈本身具有判斷與跳離迴圈的作用,而你的if-else中,else除了跳離迴圈並無其他作為,可將if判斷式移至while判斷內,簡化程式碼長度
  • for迴圈本身具有計數的功能,你使用的i++也具有計數功能,for迴圈也具備while迴圈的功能,可以將while改寫為for

 

這是我改寫後的程式碼,供你參考:

https://i.imgur.com/jg7GSh5.png

 
#27043: Re:c 位元運算


406490150@gms.tku.edu.tw (我是朱朱)

School : 國立交通大學
ID : 139794
IP address : [140.113.236.122]
Last Login :
2021-10-14 15:49:00
a414. 位元運算之進位篇 -- c910335 | From: [1.172.246.19] | Post Date : 2021-09-09 00:22

或是,不喜歡 for 初始化的位置,也可使用while-loop

https://i.imgur.com/CdEK9AO.png

 

 

或是,將count初始化置於最初之處

https://i.imgur.com/pNbmuSn.png

 
ZeroJudge Forum