C
, Bitwise
1
,SHIFT LEFT <<
, SHIFT RIGHT >>
้ๅ ฉๅ้็ฎๅญ็ๅ่ฝไธป่ฆๆฏ็งปๅไธๅ่ฎๆธไธญ็ๆๆไฝๅ ๏ผไฝๅ ๅๅทฆ / ๅๅณ็งปๅไนๅพ๏ผๆ้ซไฝ / ๆไฝไฝ็ไฝๅ ๆๆถๅคฑ๏ผๆไฝไฝ / ๆ้ซไฝ็ไฝๅ ่ฃ 0
็ถๅ จ้จไฝๅ ๅๅทฆ็งปๅไธไฝๆ๏ผๆ่ฎๆๅไพ็ๅ ฉๅ๏ผๅๅทฆ็งปๅไธไฝๆ๏ผๆ่ฎๆๅไพ็1/2ๅใ
AND &
&
็ๅ่ฝๆฏๅฐๅ ฉๅ่ฎๆธๅฐๆ็ไฝๅ ้ฒ่กAND
้่ผฏ้็ฎ๏ผ็ถๅพ็ข็ๆฐ่ฎๆธใ็จไพๅคๅฅไฝๅ ๆฏไธๆฏไธไนๅพๆนไพฟใ
ๆธฌ่ฉฆๆๅคๅฐไฝๅ ็ๅผ๏ผ1๏ผ
OR |
|
็ๅ่ฝๆฏๅฐๅ ฉๅ่ฎๆธๅฐๆ็ไฝๅ ้ฒ่กOR
้่ผฏ้็ฎใ
ไพๅฆ๏ผ
XOR ^
^
็ๅ่ฝๆฏๅฐๅ ฉๅ่ฎๆธๅฐๆ็ไฝๅ ้ฒ่กXOR
้่ผฏ้็ฎใๅฏไปฅ็จไพๅ่ฝๆไฝๅ ็ๅผ๏ผไนๅฏไปฅ็จไพๅ็ฐกๅฎๅ ๅฏใ
ๅ่ฝๆไฝๅ
ไธไฝฟ็จๆซๅญ่ฎๆธ๏ผtemporary variable๏ผไบคๆๅ ฉๅ็ธ็ฐ่ฎๆธ
ๅ ๅฏ
OUTPUT
NOT ~
~
็ๅ่ฝๆฏ้กๅไธๅ่ฎๆธๆฏไธๅไฝๅ ็ 0 ๅ 1ใ
NOT
ๅพ +1
-> ไบ่ฃๆธ -> ๆญฃ่ฒ ่ฎ่1
1
Then we add 1 to it.
Note that if the rightmost bit is 1, this would create a carry which flips all 1s into 0s until a 0 is reached.
This number is now actually also the binary representation of -number.
We now take the bitwise & of number and -number.
1
2
็ๆฌกๆนๅ็:
0010 0000
)ใ(x & -x)
ๅพๅฐ็ๆไฝไฝ set bit๏ผ่ฅๅ็ญๆผ x
ๆฌ่บซ๏ผๅ่กจ็คบ x
ๅชๆไธๅ set bit๏ผไนๅฐฑๆฏ x
็บไบ็ๆฌกๆนๆธใint
่ฎๆธ1
ๅ็:
right shift 1
ไธฆ AND 1
๏ผ่ฅ็บ TRUE
๏ผๅ ++count
ใโ
Common Solution:
่งฃ้
Use uint32_t
:
้ๆผ uint32_t
ๅฎ็พฉๅฏไปฅๆฅ็ไปฅไธ
bit
็บ1
ๆ0