开发人员应该了解哪些有用的按位操作符代码?

non*_*tor 62 language-agnostic bit-manipulation bit

我必须说我从来没有理由使用按位运算符,但我确信我已经执行了一些可以更有效地完成它们的操作."转移"和"OR-ing"如何帮助您更有效地解决问题?

CSᵠ*_*CSᵠ 135

对字符串(字符)使用按位运算

将字母转换为小写:

  • OR by space => (x | ' ')
  • 即使letter已经是小写,结果也总是小写的
  • 例如.('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")
  • 结果在1..26范围内,字母大小写并不重要
  • 例如.('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

注意:使用英文字母以外的任何内容都会产生垃圾结果

  • @ Razort4x它通过[fromCharCode](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/fromCharCode)和[charCodeAt](https://developer.mozilla)在JS中工作.组织/ EN-US /文档/ JavaScript的/参考/ Global_Objects /字符串/ charCodeAt).例如.`String.fromCharCode("a".charCodeAt(0)&95);` (6认同)
  • 你怎么知道我会感兴趣的.... :) (3认同)

Moh*_*Ali 56


  • 整数的按位运算(int)

获取最大整数

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"类型的黑客非常有用.


Sco*_*ott 12

我曾用过的频率只有三种:

  1. 设置一个位:a | = 1 <<位;

  2. 清除一点:a&=〜(1 <<位);

  3. 测试是否设置了一个位:a&(1 <<位);


u0b*_*6ae 6

事项计算:思想,算法,源代码,作者:Jorg Arndt(PDF).这本书包含大量内容,我通过http://www.hackersdelight.org/上的链接找到了它.

平均无溢出

用于计算两个自变量x和y的平均值(x + y)/ 2的例程是

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);
}
Run Code Online (Sandbox Code Playgroud)