《算法心得》高效用法记录 - earthma的专栏 - 博客频道 - CSDN.NET



《算法心得》高效用法记录 - earthma的专栏 - 博客频道 - CSDN.NET

值为1且最靠右的位元置为0 (如果存在): 0101 1110 => 010 1100 : x&(x-1)

值为0且最靠右的位元置为1 (如果存在): 0101 1110 => 010 1111 : x|(x+1)

将尾部的所有连续的1置为0(如果存在): 0101 0111 => 0101 0000 : x&(x+1)

将尾部的所有连续的0置为1(如果存在): 0101 1000 => 0101 1111 : x|(x-1)

将最靠右的0置为1(如果存在),且其他位元置为0: 0101 0111 => 0000 1000 :  ~x&(x+1)

将最靠右的1置为0(如果存在),且其他位元置为1: 0101 1000 => 1111 0111 : ~x|(x-1)

将尾部的连续0置为1(如果存在),且其他位元置为0: 0101 1000 => 0000 0111 : ~x&(x-1) or ~(x|-x) or (x&-x)-1

将尾部的连续1置为0(如果存在),且其他位元置为1: 0101 0111 => 1111 1000 : ~x|(x+1)

保留最右的1(如果存在),其他位元置为1: 0101 1000 => 0000 1000 :x&(-x)

最靠右的1及其右边的位元置为1,左边置为0: 0101 1010 => 0000 1111 : x^(x-1)

最靠右的0及其右边的位元置为1,左边置为0: 0101 1010 => 0000 0111 : x^(x+1)

右侧首个连续的1置为0: 0101 1100 => 0100 0000 (((x|(x-1))+1&x)  or ((x&-x)+x)&x



进阶:

求比某个数大且位元1的个数相同的数 例如 xxx0 1111 0000 => xxx1 0000 0111

令 x = xxx0 1111 0000

s = x&-x

r = s+x

y = r | ( ( x ^ r ) << 2 / s)


两数的平均数:

(x&y) + ((x^y)>>1) 下取整

(x|y)   - ((x^y)>>1) 上取整


统计位元'1'的个数:

1.二分搜索法:

x = (x & 0x5555 5555) + ((x>>1) & 0x5555 5555)

x = (x & 0x3333 3333) + ((x>>2) & 0x3333 3333)

x = (x & 0x0F0F 0F0F) + ((x>>4) & 0x0F0F 0F0F)

x = (x & 0x00FF 00FF) + ((x>>8) & 0x00FF 00FF)

x = (x & 0x0000 FFFF) + ((x>>16) & 0x0000 FFFF)

例举一个八位数:

x = 1 0 1 1 1 1 0 0  

x1 = 01 10 10 00

x2 = 0011 0010

x3 = 00000101 = 5

上述代码中有多余的与操作

可以写成如下简单代码:

int pop(unsigned x){

x = x - ((x>>1) & 0x5555 5555)

x = (x & 0x3333 3333) + ((x>>2) & 0x3333 3333)

x = (x+(x>>4)) & 0x0F0F 0F0F

x = x+(x>>8)

        x = x + (x>>16)

return x& 0x0000 003F

}

第一行中x的值是由以下公式而来:

pop(x) =  x - [x/2] - [x/4]-···-[x/2^31]


Read full article from 《算法心得》高效用法记录 - earthma的专栏 - 博客频道 - CSDN.NET


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts