與運算
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);
}
*/