板牙  
失败是什么?没有什么,只是更走近成功一步;而成功是走过了所有通向失败的路...只要你心够决!
位运算是指按二进制位进行的运算。因为在系统软件中,常要处理二进制位的问题。
例如:将一个存储单元中的各二进制位左移或右移一位,两个数按位相加等。
运算符 含义 功能
按位与 如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。
| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1。
按位异或 若参加运算的两个二进制位同号则结果为0(假)异号则结果为1(真)
取反 ~是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,将1变0。
<< 左移 左移运算符是用来将一个数的各二进制位全部左移N位,右补0。
>> 右移 表示将a的各二进制位右移N位,移到右端的低位被舍弃,对无符号数,高位补0。


“按位与”(c中为&)(vb中为'And')

运算原则:0&0=0,0&1=0,1&0=0,1&1=1

MSDN中的:0x38=0xf8 & 0x3f    (00111000=11111000 & 00111111)

用途:
<1>取一个数中某些指定的位
如有一个整数a(2个字节),
想要取其中的低字节,只需将a与8个1按位与即可
a   00101100  10101100
b   00000000  11111111
c    00000000  10101100

“按位或”运算符(|)
运算原则:0|0=0,0|1=1,1|0=1,1|1=1
MSDN中的:0xff=0xf8 | 0x3f        (11111111=11111000 | 00111111)

“按位异或”运算符(c中为^)(vb中为Xor)
运算原则:0∧0=0,0∧1=1,1∧0=1, 1∧1=0
MSDN中的:0xc7=0xf8 ^ 0x3f          (11000111=11111000 ^ 00111111)
用法:
a=3,b=4。
想将a和b的值互换,可以用以下赋值语句实现:
    a=a^b;
    b=b^a;
    a=a^b;
a=011
    (^)b=100
a=111(a^b的结果,a已变成7)
    (^)b=100
b=011(b^a的结果,b已变成3)
    (^)a=111
a=100(a^b的结果,a已变成4)

“取反”运算符(~)
~ 运算符对操作数执行按位求补运算,其效果相当于反转每一位。
MSDN:
~0x00000000 = 0xffffffff
~0x00000111 = 0xfffffeee
~0x000fffff = 0xfff00000
~0x00008888 = 0xffff7777
~0x22000022 = 0xddffffdd

“左移”运算符(<<)
左移运算符 (<<) 将第一个操作数向左移动第二个操作数指定的位数。第二个操作数的类型必须是 int

MSDN中的备注:
如果第一个操作数是 intuint(32 位数),则移位数由第二个操作数的低 5 位给出。
如果第一个操作数是 longulong(64 位数),则移位数由第二个操作数的低 6 位给出。
第一个操作数的高序位被放弃,低序空位用 0 填充。移位操作从不导致溢出。
(c#中:
int i = 1;
long lg = 1;
Console.WriteLine("0x{0:x}", i << 1);
Console.WriteLine("0x{0:x}", i << 33);
Console.WriteLine("0x{0:x}", lg << 33);
输出:
0x2
0x2
0x200000000

“右移”运算符(>>)
右移运算符 (>>) 将第一个操作数向右移动第二个操作数所指定的位数。
MSDN中的备注:
如果第一个操作数为 intuint(32 位数),则移位数由第二个操作数的低五位给出(第二个操作数 & 0x1f)。
如果第一个操作数为 longulong(64 位数),则移位数由第二个操作数的低六位给出(第二个操作数 & 0x3f)。
如果第一个操作数为 intlong,则右移位是算术移位(高序空位设置为符号位)。如果第一个操作数为 uintulong 类型,则右移位是逻辑移位(高位填充 0)。
c#中:
int i = -1000;
Console.WriteLine(i >> 3);
输出:-125

public long change1(byte b, long a, long c)//-------------------------
{
     long cHi = c / 256;
     long cLo = c % 256;
     cLo = cLo ^ b;
     c = cHi * 256 + cLo;
     for (int i = 8; i >= 1; i--)
     {
          long tempc = c;
          c = c / 2;
          if (tempc % 2 != 0)
          {
                c = c ^ a;
          }
          //else
          //    c = c / 2;
      }
      return c;
}

posted on 2009-05-23 19:53  板牙  阅读(569)  评论(0编辑  收藏  举报