有什么好方法可以利用按位运算符?

时间:2011-04-04 18:47:06

标签: bit-manipulation

我经常会遇到使用按位运算符的人来做快速,简单和优雅的事情。我想学习一些有用的技巧。什么是一些最有用的按位运算符案例?

6 个答案:

答案 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)
 

<<运算符

乘以2 n
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

>>运算符

除以2 n
int n=3;
int b = 32>>n;
printf("%d\n",b);

输出: 8

说明: \frac{32}{2^{^{3}}}= 4

32 in binary 100000
100000>>3 (left shift 3 times) will be 000100
100 is equivalent to 4