我经常会遇到使用按位运算符的人来做快速,简单和优雅的事情。我想学习一些有用的技巧。什么是一些最有用的按位运算符案例?
答案 0 :(得分:5)
恒定时间2次幂:
x = 1 << n; // x = pow(2, n)
答案 1 :(得分:2)
虽然我一般同意迈克尔·麦高恩的观点,但在某些情况下,有点麻烦的黑客可能非常有用,例如在编写没有所有常用指令的嵌入式硬件时。在将程序编码为SMT求解器等定理证明器时,我也很好地利用了这些技术,这些算法并不支持我想要使用的所有操作。
我在寻找问题的按位解决方案时的第一站是网站bit twiddling hacks。对于许多最常用的技术,它有很多代码片段。
然后还有一本书Hacker's Delight涵盖了一些深入的技巧。
答案 2 :(得分:1)
我在这个地方找到了一些有趣的按位操作集合: http://graphics.stanford.edu/~seander/bithacks.html
答案 3 :(得分:0)
通常使用这些技巧并不是一个好主意。现代编译器经常在幕后做这种事情。也就是说,有时您知道编译器没有(可能在运行时保证特定值为2的幂)。如果您确定尝试此类技巧是个好主意,here are useful bit twiddling hacks。
答案 4 :(得分:0)
您始终可以使用左移位运算符(&lt;&lt;)将给定数乘以2。
对于前 -
public class abc {public static void main (String[] arg)
{
int a = 650;
int doubleOfa = a<<1;
System.out.println(a);
System.out.println(doubleOfa);
}
}
答案 5 :(得分:0)
char A[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int n= strlen(A);
for(int i=0;i<n;i++){
if(A[i]>='A' && A[i]<='Z'){
A[i] |= ' '; //A[i]=A[i] | ' ';
}
}
printf("%s\n",A);
输出
abcdefghijklmnopqrstuvwxyz
说明:
‘A’ = b01000001
|‘ ‘ = b00100000
----------------
b01100001 =‘a’
char A[] = "abcdefghijklmnopqrstuvwxyz";
int n= strlen(A);
for(int i=0;i<n;i++){
if(A[i]>='a' && A[i]<='z'){
A[i] &= '_';
}
}
printf("%s\n",A);
输出
ABCDEFGHIJKLMNOPQRSTUVWXYZ
说明:**
‘a’ = b01100001
&‘_‘ = b11011111
----------------
b01000001 =‘A’
确定整数是奇数还是偶数
int n=100;
printf("%s\n", n&1?"odd":"even");
n=33;
printf("%s\n", n&1?"odd":"even");
输出:
even
odd
说明:(n&1)如果n为奇数,则返回1,而当其为偶数时,返回0。
如果n为奇数,则二进制表示形式中n的最后一位将始终为1。这就是为什么当我们以1表示结果时,其结果为1。如果n为偶数,则二进制表示形式中n的最后一位将始终为0。这就是为什么当我们以1表示结果为0时的原因。
(例如(奇数)xxxxx1&1 = 1,(偶数)xxxxx0&1 = 0)
char A[] = "AbCdEfGhIjKlMnOpQrStUvWxYz";
int n= strlen(A);
for(int i=0;i<n;i++){
A[i] ^= ' ';
}
printf("%s\n",A);
输出
aBcDeFgHiJkLmNoPqRsTuVwXyZ
说明:**
‘A’ = b01000001
^‘ ‘ = b00100000
----------------
b01100001 =‘a’
‘a’ = b01100001
^‘ ‘ = b00100000
----------------
b01000001 =‘A’
交换两个没有温度的数字
int x=12, y=20;
printf("%d %d\n",x, y);
x^=y; //x=x^y
y^=x; //y=x^y
x^=y; //x=x^y
printf("%d %d\n",x, y);
输出:
12 20
20 12
**说明:**
x=12 y=20
now for x=x^y
12 = b01100
^20 = b10100
-------------
x = b11000
now for y=x^y
x = b11000
^20 = b10100
-------------
y = b01100 =12 (swapped)
now for y=x^y
x = b11000
^y = b01100
-------------
x = b10100 =20 (swapped)
int n=3;
int b = 4<<n;
printf("%d\n",b);
输出: 32
说明: 4x2 3 = 32
4 in binary 100
100<<3 (right shift 3 times) will be 100000
100000 is equivalent to 32
设置值2 n
int n=3;
int b = 1<<n;
printf("%d\n",b);
输出: 8
说明::1 * 2 3 = 8
int n=3;
int b = 32>>n;
printf("%d\n",b);
输出: 8
说明:
32 in binary 100000
100000>>3 (left shift 3 times) will be 000100
100 is equivalent to 4