non*_*tor 62 language-agnostic bit-manipulation bit
我必须说我从来没有理由使用按位运算符,但我确信我已经执行了一些可以更有效地完成它们的操作."转移"和"OR-ing"如何帮助您更有效地解决问题?
CSᵠ*_*CSᵠ 135
将字母转换为小写:
OR by space => (x | ' ') ('a' | ' ') => 'a';('A' | ' ') => 'a'将字母转换为大写:
AND by underline => (x & '_') ('a' & '_') => 'A';('A' & '_') => 'A'反转信的情况:
XOR by space => (x ^ ' ') ('a' ^ ' ') => 'A';('A' ^ ' ') => 'a'字母在字母表中的位置:
ANDby chr(31)/ binary('11111')/(hex('1F')=>(x & "\x1F") ('a' & "\x1F") => 1;('B' & "\x1F") => 2获取字母在字母表中的位置(仅限大写字母):
ANDby ?=> (x & '?') 或 XOR by @ =>(x ^ '@') ('C' & '?') => 3;('Z' ^ '@') => 26 获取字母的字母位置(仅适用于小写字母):
XOR通过backtick/chr(96)/ binary('1100000')/ hex('60') =>(x ^ '`') ('d' ^ '`') => 4;('x' ^ '`') => 25 注意:使用英文字母以外的任何内容都会产生垃圾结果
Moh*_*Ali 56
获取最大整数
int maxInt = ~(1 << 31);
int maxInt = (1 << 31) - 1;
int maxInt = (1 << -1) - 1;
Run Code Online (Sandbox Code Playgroud)
获取最小整数
int minInt = 1 << 31;
int minInt = 1 << -1;
Run Code Online (Sandbox Code Playgroud)
获得最大的长度
long maxLong = ((long)1 << 127) - 1;
Run Code Online (Sandbox Code Playgroud)
乘以2
n << 1; // n*2
Run Code Online (Sandbox Code Playgroud)
除以2
n >> 1; // n/2
Run Code Online (Sandbox Code Playgroud)
乘以2的m次方乘以
n << m;
Run Code Online (Sandbox Code Playgroud)
除以2的m次方
n >> m;
Run Code Online (Sandbox Code Playgroud)
检查奇数
(n & 1) == 1;
Run Code Online (Sandbox Code Playgroud)
交换两个值
a ^= b;
b ^= a;
a ^= b;
Run Code Online (Sandbox Code Playgroud)
获得绝对价值
(n ^ (n >> 31)) - (n >> 31);
Run Code Online (Sandbox Code Playgroud)
获取最多两个值
b & ((a-b) >> 31) | a & (~(a-b) >> 31);
Run Code Online (Sandbox Code Playgroud)
获取两个值的最小值
a & ((a-b) >> 31) | b & (~(a-b) >> 31);
Run Code Online (Sandbox Code Playgroud)
检查两者是否具有相同的符号
(x ^ y) >= 0;
Run Code Online (Sandbox Code Playgroud)
计算2 ^ n
2 << (n-1);
Run Code Online (Sandbox Code Playgroud)
是否是2的阶乘
n > 0 ? (n & (n - 1)) == 0 : false;
Run Code Online (Sandbox Code Playgroud)
Modulo 2 ^ n对m
m & (n - 1);
Run Code Online (Sandbox Code Playgroud)
获得平均值
(x + y) >> 1;
((x ^ y) >> 1) + (x & y);
Run Code Online (Sandbox Code Playgroud)
得到n的第m位(从低到高)
(n >> (m-1)) & 1;
Run Code Online (Sandbox Code Playgroud)
将n的第m位设置为0(从低到高)
n & ~(1 << (m-1));
Run Code Online (Sandbox Code Playgroud)
n + 1
-~n
Run Code Online (Sandbox Code Playgroud)
n - 1
~-n
Run Code Online (Sandbox Code Playgroud)
获取对比度数字
~n + 1;
(n ^ -1) + 1;
Run Code Online (Sandbox Code Playgroud)
if(x == a)x = b; if(x == b)x = a;
x = a ^ b ^ x;
Run Code Online (Sandbox Code Playgroud)
Mar*_*ett 41
看看着名的Bit Twiddling Hacks
大多数乘法/除法都是不必要的 - 编译器会自动执行此操作,您只会混淆人们.
但是,如果你使用硬件或通信协议,有一堆"检查/设置/切换位N"类型的黑客非常有用.
事项计算:思想,算法,源代码,作者:Jorg Arndt(PDF).这本书包含大量内容,我通过http://www.hackersdelight.org/上的链接找到了它.
平均无溢出
用于计算两个自变量x和y的平均值(x + y)/ 2的例程是
Run Code Online (Sandbox Code Playgroud)static inline ulong average(ulong x, ulong y) // Return floor( (x+y)/2 ) // Use: x+y == ((x&y)<<1) + (x^y) // that is: sum == carries + sum_without_carries { return (x & y) + ((x ^ y) >> 1); }
| 归档时间: |
|
| 查看次数: |
29829 次 |
| 最近记录: |