位运算
2009-05-23 19:53
176 查看
位运算是指按二进制位进行的运算。因为在系统软件中,常要处理二进制位的问题。
例如:将一个存储单元中的各二进制位左移或右移一位,两个数按位相加等。
“按位与”(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中的备注:
如果第一个操作数是 int 或 uint(32 位数),则移位数由第二个操作数的低 5 位给出。
如果第一个操作数是 long 或 ulong(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中的备注:
如果第一个操作数为 int 或 uint(32 位数),则移位数由第二个操作数的低五位给出(第二个操作数 & 0x1f)。
如果第一个操作数为 long 或 ulong(64 位数),则移位数由第二个操作数的低六位给出(第二个操作数 & 0x3f)。
如果第一个操作数为 int 或 long,则右移位是算术移位(高序空位设置为符号位)。如果第一个操作数为 uint 或 ulong 类型,则右移位是逻辑移位(高位填充 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;
}
例如:将一个存储单元中的各二进制位左移或右移一位,两个数按位相加等。
运算符 | 含义 | 功能 |
& | 按位与 | 如果两个相应的二进制位都为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中的备注:
如果第一个操作数是 int 或 uint(32 位数),则移位数由第二个操作数的低 5 位给出。
如果第一个操作数是 long 或 ulong(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中的备注:
如果第一个操作数为 int 或 uint(32 位数),则移位数由第二个操作数的低五位给出(第二个操作数 & 0x1f)。
如果第一个操作数为 long 或 ulong(64 位数),则移位数由第二个操作数的低六位给出(第二个操作数 & 0x3f)。
如果第一个操作数为 int 或 long,则右移位是算术移位(高序空位设置为符号位)。如果第一个操作数为 uint 或 ulong 类型,则右移位是逻辑移位(高位填充 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;
}
相关文章推荐
- 图像处理__腐蚀和膨胀_开运算_闭运算
- 四则运算作业
- 位运算实现四则运算-python版
- Big Number-大数运算
- 四则运算
- 第一周 第四讲 无穷小与无穷大及极限的运算法则
- 数据与运算(以及补码)
- C语言中的位移运算
- 指针算数运算
- 韩顺平_轻松搞定网页设计(html+css+javascript)_第21讲_js运算符2_js移位运算_学习笔记_源代码图解_PPT文档整理
- 四则运算3
- 为什么Python没有自增(++)或自减(--)运算?
- JAVA的浮点运算
- 不用0,1,2,以及加减乘除来进行运算——阿隆佐·邱奇
- 计蒜客强迫症的吃货(位运算枚举)
- javascript 中的二进制运算
- 四则运算三
- pta 一元多项式的乘法与加法运算
- 100-46.搜狐(运算)
- 四则运算3+psp0