摘自: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 一凡 阅读(1466) |
评论 (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 一凡 阅读(341) |
评论 (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 一凡 阅读(253) |
评论 (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 一凡 阅读(3391) |
评论 (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 一凡 阅读(234) |
评论 (0) |
编辑 收藏
posted @
2010-08-30 14:41 一凡 阅读(162) |
评论 (0) |
编辑 收藏
分布式设计与开发:
http://www.javaeye.com/topic/748178
posted @
2010-08-30 14:40 一凡 阅读(135) |
评论 (0) |
编辑 收藏
posted @
2010-08-30 14:33 一凡 阅读(187) |
评论 (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 一凡 阅读(745) |
评论 (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 一凡 阅读(399) |
评论 (0) |
编辑 收藏