程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C/C++一些比較有意思的算法

C/C++一些比較有意思的算法

編輯:C++入門知識

與運算

int x=9999;

int count = 0;

while(x)

{

count++;

x=x&(x-1);

}

printf("%d",count);

輸出結果是8;

將9999化成二進制:9999/2=4999…1;

4999/2=2499…1

……

最後反過來寫得到:10 0111 0000 1111;

而x-1即是 9998   :10 0111 0000 1110;

與一下就成了       :10 0111 0000 1110

即把原來的1變成0;一次下去經過八次變成0;

編程風格

if('A'==a){}寫法比if(a=='A'){}好,因為如果把‘==’寫成‘=’會報錯,常量不准許賦值。

 


運算符

#include <iostream>

using namespace std;

int main()

{

unsigned char a=0xA5;

  unsigned char b=~a>>4+1;

printf("b=%d\n",b);

return 0;

}

因為~的優先級別高於>>,所以是先對a取反,即1010 0101----> 0101 1010 因為+的優先級別大於>>,所以是右移5位,得到:0000 0010 結果是2;

但是這確實錯誤的答案,在vs2008上運行的時候結果卻是 250;原來這是16為寄存器,0xA5是:0000 0000 1010 0101;取反之後變成:1111 1111 0101 1010 右移5位後得到的是:0000 0111 1111 1010;由於unsigned char型只能表示低八位,這樣既得到: 250;

 


算法

用一個表達式判斷一個數X是不是2的N次方(2,4,8……),不可以用循環語句。

答案:!(X&(X-1))

 


int f(int x,int y)

{

return (x&y)+((x^y)>>1);

}

(729,271)=?

仔細看一下題目發現:x&y是取相同的位與,這個的結果是x和y相同位的一半,x^y是取不相同的位與,又移一位相當除以2,這個函數的功能就是取兩個書的平均值。

 


有兩個變量a和b,不用if,?:,switch或其他判斷語句,找出其中比較大的那個。

答案:

int max = ((a+b)+abs(a-b))/2

 


如何將a和b兩個數的值交換,並且不使用任何中間變量。

方案一:

a=a+b;

b=a-b;

a=a-b;

方案二:

a=a^b;

b=a^b;

a=a^b;

異或運算法則:

a^a=0;

a^b=b^a;

a^b^c=a^(b^c)=(a^b^c);

d=a^b^c可得:a=d^b^c;

a^b^c=b;

 


字節:

#include <stdio.h>
void main()
{
int a,b,c,d,e,f,g;
char str1[100];
int str2[100];

a=sizeof(int);//int型是4個字節
b=sizeof(char);//char 1個字節
c=sizeof(1);// 4個字節
d=sizeof('c');//一個字節
e=sizeof("Hello");//每個字母一個字節 加上後面隱含的'\0',共6個字節
f=sizeof(str1);//100個字節
g=sizeof(str2);//定義了100個int型 共400個字節


printf("%d,%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,f,g);
}
*/
/*
#include <stdio.h>
void main()
{
int a=sizeof("我們");//漢字是兩個字節
printf("%d",a);
}
*/

 

 

 

 

 

 

 

 

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved