摘自:http://edu.codepub.com/2009/0929/15909.php
應用舉例
(1) 判斷int型變量a是奇數還是偶數
a&1 = 0 偶數
a&1 = 1 奇數
(2) 取int型變量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
(3) 將int型變量a的第k位清0,即a=a&~(1 < <k)
(4) 將int型變量a的第k位置1, 即a=a ¦(1 < <k)
(5) int型變量循環左移k次,即a=a < <k ¦a>>16-k (設sizeof(int)=16)
(6) int型變量a循環右移k次,即a=a>>k ¦a < <16-k (設sizeof(int)=16)
(7)整數的平均值
對于兩個整數x,y,如果用 (x+y)/2 求平均值,會產生溢出,因為 x+y 可能會大于INT_MAX,但是我們知道它們的平均值是肯定不會溢出的,我們用如下算法:
int average(int x, int y) //返回X,Y 的平均值
{
return (x&y)+((x^y)>>1);
}
(8)判斷一個整數是不是2的冪,對于一個數 x >= 0,判斷他是不是2的冪
boolean power2(int x)
{
return ((x&(x-1))==0)&&(x!=0);
}
(9)不用temp交換兩個整數
void swap(int x , int y)
{
x ^= y;
y ^= x;
x ^= y;
}
(10)計算絕對值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}
(11)取模運算轉化成位運算 (在不產生溢出的情況下)
a % (2^n) 等價于 a & (2^n - 1)
(12)乘法運算轉化成位運算 (在不產生溢出的情況下)
a * (2^n) 等價于 a < < n
(13)除法運算轉化成位運算 (在不產生溢出的情況下)
a / (2^n) 等價于 a>> n
例: 12/8 == 12>>3
(14) a % 2 等價于 a & 1
(15) if (x == a) x= b;
else x= a;
等價于 x= a ^ b ^ x;
(16) x 的 相反數 表示為 (~x+1)
實例
功能 ¦ 示例 ¦ 位運算
----------------------+---------------------------+--------------------
去掉最后一位 ¦ (101101->10110) ¦ x >> 1
在最后加一個0 ¦ (101101->1011010) ¦ x < < 1
在最后加一個1 ¦ (101101->1011011) ¦ x < < 1+1
把最后一位變成1 ¦ (101100->101101) ¦ x ¦ 1
把最后一位變成0 ¦ (101101->101100) ¦ x ¦ 1-1
最后一位取反 ¦ (101101->101100) ¦ x ^ 1
把右數第k位變成1 ¦ (101001->101101,k=3) ¦ x ¦ (1 < < (k-1))
把右數第k位變成0 ¦ (101101->101001,k=3) ¦ x & ~ (1 < < (k-1))
右數第k位取反 ¦ (101001->101101,k=3) ¦ x ^ (1 < < (k-1))
取末三位 ¦ (1101101->101) ¦ x & 7
取末k位 ¦ (1101101->1101,k=5) ¦ x & ((1 < < k)-1)
取右數第k位 ¦ (1101101->1,k=4) ¦ x >> (k-1) & 1
把末k位變成1 ¦ (101001->101111,k=4) ¦ x ¦ (1 < < k-1)
末k位取反 ¦ (101001->100110,k=4) ¦ x ^ (1 < < k-1)
把右邊連續的1變成0 ¦ (100101111->100100000) ¦ x & (x+1)
把右起第一個0變成1 ¦ (100101111->100111111) ¦ x ¦ (x+1)
把右邊連續的0變成1 ¦ (11011000->11011111) ¦ x ¦ (x-1)
取右邊連續的1 ¦ (100101111->1111) ¦ (x ^ (x+1)) >> 1
去掉右起第一個1的左邊 ¦ (100101000->1000) ¦ x & (x ^ (x-1))
判斷奇數 (x&1)==1
判斷偶數 (x&1)==0
例如求從x位(高)到y位(低)間共有多少個1
public static int FindChessNum(int x, int y, ushort k)
{
int re = 0;
for (int i = y; i <= x; i++)
{
re += ((k >> (i - 1)) & 1);
}
return re;
}
posted @
2010-10-29 12:21 一凡 閱讀(1469) |
評論 (0) |
編輯 收藏
目錄結構:com/test/JniTest.java
package : com.test
javac com/test/JniTest.java
javah -classpath ./ -jni com.test.JniTest
在當前目錄下生成:
com_test_JniTest.h
posted @
2010-10-27 12:17 一凡 閱讀(344) |
評論 (0) |
編輯 收藏
方法一:
進入MySQL安裝目錄 打開MySQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改為 max_connections=1000 ,服務里重起MySQL即可
注意:如果新增max_connections,必須放在mysqld下,如:
[mysqld]
max_connections=300
方法二:
登錄至數據庫,執行以下命令:
set GLOBAL max_connections=500;
show variables like 'max_con%';
posted @
2010-09-16 14:08 一凡 閱讀(256) |
評論 (0) |
編輯 收藏
需求:廣告按權重展現
基本算法描述如下:
1、每個廣告增加權重
2、將所有匹配廣告的權重相加sum,
3、以相加結果為隨機數的種子,生成1~sum之間的隨機數rd
4、.接著遍歷所有廣告,訪問順序可以隨意.將當前節點的權重值加上前面訪問的各節點權重值得curWt,判斷curWt >= rd,如果條件成立則返回當前節點,如果不是則繼續累加下一節點. 直到符合上面的條件,由于rd<=sum 因此一定存在curWt>=rd。
特別說明:
此算法和廣告的順序無關
測試代碼如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;


public class Test
{


/** *//**
* @param args
*/
@SuppressWarnings("unchecked")

public static void main(String[] args)
{
List<Node> arrNodes = new ArrayList<Node>();
Node n = new Node(10, "測試1");
arrNodes.add(n);
n = new Node(20, "測試2");
arrNodes.add(n);
n = new Node(30, "測試3");
arrNodes.add(n);
n = new Node(40, "測試4");
arrNodes.add(n);
//Collections.sort(arrNodes, new Node());
Map<String, Integer> showMap = null;
int sum = getSum(arrNodes);
int random = 0;
Node kw = null;

for(int k = 0; k < 20; k++)
{
showMap = new LinkedHashMap<String, Integer>();

for(int i = 0; i < 100; i++)
{
random = getRandom(sum);
kw = getKW(arrNodes, random);

if(showMap.containsKey(kw.kw))
{
showMap.put(kw.kw, showMap.get(kw.kw) + 1);

} else
{
showMap.put(kw.kw, 1);
}
//System.out.println(i + " " +random + " " + getKW(arrNodes, random));
}
System.out.print(k + " ");
System.out.println(showMap);
}
}

public static Node getKW(List<Node> nodes, int rd)
{
Node ret = null;
int curWt = 0;

for(Node n : nodes)
{
curWt += n.weight;

if(curWt >= rd)
{
ret = n;
break;
}
}
return ret;
}

public static int getSum(List<Node> nodes)
{
int sum = 0;
for(Node n : nodes)
sum += n.weight;
return sum;
}

public static int getRandom(int seed)
{
return (int)Math.round(Math.random() * seed);
}
}

class Node implements Comparator
{
int weight = 0;
String kw = "";

public Node()
{}

public Node(int wt, String kw)
{
this.weight = wt;
this.kw = kw;
}

public String toString()
{
StringBuilder sbBuilder = new StringBuilder();
sbBuilder.append(" weight=").append(weight);
sbBuilder.append(" kw").append(kw);
return sbBuilder.toString();
}

public int compare(Object o1, Object o2)
{
Node n1 = (Node)o1;
Node n2 = (Node)o2;
if(n1.weight > n2.weight)
return 1;
else
return 0;
}
}
posted @
2010-08-31 17:08 一凡 閱讀(3396) |
評論 (0) |
編輯 收藏
#!/bin/bash

MYSQL_HOME="/home/work/local/mysql5"
MYSQL_SRC_HOME="mysql-5.1.38"

cd $MYSQL_SRC_HOME
make clean
./configure \
--prefix=$MYSQL_HOME \
--with-tcp-port=3308 \
--enable-thread-safe-client \
--enable-local-infile \
--with-unix-socket-path=$MYSQL_HOME/mysql.sock \
--with-charset=gbk \
--with-innodb \
--with-extra-charsets=gbk,utf8,ascii,big5,latin1 \
--enable-static \
--enable-assemble

make
make install

cd $MYSQL_HOME
cp ./share/mysql/my-huge.cnf ./my.cnf

./bin/mysql_install_db
./bin/mysqld_safe &


posted @
2010-08-30 16:43 一凡 閱讀(238) |
評論 (0) |
編輯 收藏
posted @
2010-08-30 14:41 一凡 閱讀(164) |
評論 (0) |
編輯 收藏
分布式設計與開發:
http://www.javaeye.com/topic/748178
posted @
2010-08-30 14:40 一凡 閱讀(138) |
評論 (0) |
編輯 收藏
posted @
2010-08-30 14:33 一凡 閱讀(189) |
評論 (0) |
編輯 收藏
摘自:http://hi.baidu.com/zhouqleilo/blog/item/f76297127ed0c9085aaf5330.html
經常使用的正則表達式
^
行首
$
行尾
. 任意一個字符
* 任意多個字符
\ 轉義字符
^ [ t h e ]
以t h e開頭行
[ S s ] i g
n a [ l L ] 匹配單詞s i g n a l、s
i g n a L、S i g n a l、S i g n a L
[Ss]igna[lL]".
同上,但加一句點
[ m a y M A
Y ] 包含m a y大寫或小寫字母的行
^ U S E R $
只包含U S E R的行
[tty]$
以t t y結尾的行
\ .
帶句點的行
^ d . . x .
. x . . x 對用戶、用戶組及其他用戶組成員有可執行權限的目錄
^ [ ^ l ] 排除關聯目錄的目錄列表
^[^d] ls –l |
grep ^[^d] 只顯示非文件夾的文件
[ . * 0 ]
0之前或之后加任意字符
[ 0 0 0 * ]
0 0 0或更多個
[ iI]
大寫或小寫I
[ i I ] [ n
N ] 大寫或小寫i或n
[ ^ $ ]
空行
[ ^ . * $ ]
匹配行中任意字符串
^ . . . . .
. $ 包括6個字符的行
[a- zA-Z]
任意單字符
[ a - z ] [ a - z ] * 至少一個小寫字母
[ ^ 0 - 9 "
$ ] 非數字或美元標識
[ ^ 0 - 0 A
- Z a - z ] 非數字或字母
[ 1 2 3 ]
1到3中一個數字
[ D d ] e v
i c e 單詞d e v i c e或D
e v i c e
D e . . c e
前兩個字母為D e,后跟兩個任意字符,
最后為c e
" ^ q
以^ q開始行
^ . $
僅有一個字符的行
^".[0-9][0-9]
以一個句點和兩個數字開始的行
' " D e v i c e " ' 單詞d e v i c e
D e [ V v ] i c e \ . 單詞D e v i c e或d e v i c e
([0-9]{2}/[a-zA-Z]{3}/[0-9]{4}) 對
日期格式08/Jun/2010
([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) I P地址格式
[ ^ . * $ ]
匹配任意行
[A-Za-z]* 匹配所有單詞
功能說明:查找文件里符合條件的字符串。
語 法:grep
[-abcEFGhHilLnqrsvVwxy][-A<顯示列數>][-B<顯示列數>][-C<顯示列數>]
[-d<進行動作>][-e<范本樣式>][-f<范本文件>][--help][范本樣式][文件或目錄...]
補充說明:grep指令用于查找內容包含指定的范本樣式的文件,如果發現某文件的內容符合所指定的范本樣式,預設
grep指令會把含有范本樣式的那一列顯示出來。若不指定任何文件名稱,或是所給予的文件名為“-”,則grep指令會從標準輸入設備讀取數據。
參 數:
-a或--text 不要忽略二進制的數據。
-A<顯示列數>或--after-context=<顯示列數>
除了顯示符合范本樣式的那一列之外,并顯示該列之后的內容。
-b或--byte-offset 在顯示符合范本樣式的那一列之前,標示出該列第一個字符的位編號。
-B<顯示列數>或--before-context=<顯示列數>
除了顯示符合范本樣式的那一列之外,并顯示該列之前的內容。
-c或--count 計算符合范本樣式的列數。
-C<顯示列數>或--context=<顯示列數>或-<顯示列數>
除了顯示符合范本樣式的那一列之外,并顯示該列之前后的內容。
-d<進行動作>或--directories=<進行動作>
當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep指令將回報信息并停止動作。
-e<范本樣式>或--regexp=<范本樣式> 指定字符串做為查找文件內容的范本樣式。
-E或--extended-regexp 將范本樣式為延伸的普通表示法來使用。
-f<范本文件>或--file=<范本文件>
指定范本文件,其內容含有一個或多個范本樣式,讓grep查找符合范本條件的文件內容,格式為每列一個范本樣式。
-F或--fixed-regexp 將范本樣式視為固定字符串的列表。
-G或--basic-regexp 將范本樣式視為普通的表示法來使用。
-h或--no-filename 在顯示符合范本樣式的那一列之前,不標示該列所屬的文件名稱。
-H或--with-filename 在顯示符合范本樣式的那一列之前,表示該列所屬的文件名稱。
-i或--ignore-case 忽略字符大小寫的差別。
-l或--file-with-matches 列出文件內容符合指定的范本樣式的文件名稱。
-L或--files-without-match 列出文件內容不符合指定的范本樣式的文件名稱。
-n或--line-number 在顯示符合范本樣式的那一列之前,標示出該列的列數編號。
-q或--quiet或--silent 不顯示任何信息。
-r或--recursive 此參數的效果和指定“-d recurse”參數相同。
-s或--no-messages 不顯示錯誤信息。
-v或--revert-match 反轉查找。
-V或--version 顯示版本信息。
-w或--word-regexp 只顯示全字符合的列。
-x或--line-regexp 只顯示全列符合的列。
-y 此參數的效果和指定“-i”參數相同。
--help 在線幫助。
posted @
2010-07-15 19:40 一凡 閱讀(748) |
評論 (0) |
編輯 收藏
摘自:http://learn.akae.cn/media/ch03s03.html
Man Page
Man Page是Linux開發最常用的參考手冊,由很多頁面組成,每個頁面描述一個主題,這些頁面被組織成若干個Section。FHS(Filesystem Hierarchy Standard)標準規定了Man Page各Section的含義如下:
表 3.1. Man Page的Section
Section |
描述 |
1 |
用戶命令,例如ls(1) |
2 |
系統調用,例如_exit(2) |
3 |
庫函數,例如printf(3) |
4 |
特殊文件,例如null(4) 描述了設備文件/dev/null 、/dev/zero 的作用 |
5 |
系統配置文件的格式,例如passwd(5) 描述了系統配置文件/etc/passwd 的格式 |
6 |
游戲 |
7 |
其它雜項,例如bash-builtins(7) 描述了bash 的各種內建命令 |
8 |
系統管理命令,例如ifconfig(8) |
注意區分用戶命令和系統管理命令,用戶命令通常位于/bin
和/usr/bin
目錄,系統管理命令通常位于/sbin
和/usr/sbin
目錄,一般用戶可以執行用戶命令,而執行系統管理命令經常需要root
權限。系統調用和庫函數的區別將在第 2 節 “main
函數和啟動例程”說明。
Man Page中有些頁面有重名,比如敲man printf
命令看到的并不是C函數printf
,而是位于第1個Section的系統命令printf
,要查看位于第3個Section的printf
函數應該敲man 3 printf
,也可以敲man -k printf
命令搜索哪些頁面的主題包含printf
關鍵字。本書會經常出現類似printf(3)
這樣的寫法,括號中的3表示Man Page的第3個Section,或者表示“我這里想說的是printf
庫函數而不是printf
命令”。
posted @
2010-06-21 15:20 一凡 閱讀(403) |
評論 (0) |
編輯 收藏