C语言视频 VS2015:[20]位运算符
Visual Studio 2015的发布,跟随而来的相关的教程的空白,这里讲逐步在Visual Studio 2015上讲解C语言相关的系列视频教程经验(注:由于视频修改难度大,所以先暂时发布文档,视频后期逐步补上),本文主要涉及:
① 按位取反位运算符:~
② 按位求与位运算符:&
③ 按位求或位运算符:|
④ 按位异或位运算符:^
⑤ 按位右移位运算符:>>
⑥ 按位左移位运算符:<<
简述
- 01
位运算符跟我们前面介绍的 逻辑运算符的运算逻辑是一致的,区别在于: ① 逻辑运算符是把整个操作数当做整体来判断,非0就是0,即可以等价替换成1来进行操作; 位运算符是把数据的二进制形式中每一位当做一个整体来进行处理; ② 逻辑运算符是宏观上的操作; 位运算符是微观上的操作 ;
- 02
按位取反位运算符 ~对应于 逻辑运算符 ! 按位求与位运算符 &对应于 逻辑运算符 && 按位求或位运算符 |对应于 逻辑运算符 || 当然位运算符还多了三个运算符: 按位异或运算符 ^ 按位右移位运算符:>> 按位左移位运算符:<<
~
- 01
① 通过快捷键F1打开msdn; ② 输入 One's Complemet Operator; ③ 在列表选项里面选择 One's Complement Operator; 于是便打开了msdn对于按位取反运算符的解释; 注:在国外书籍或者msdn中把按位取反运算符称为“ 一的反码算子”有时候也称为“ 按位反码”,
- 02
对操作数的每一位进行反码操作,也就是说,对于每一位而言,如果这一位是1,那么结果就是0,如果这一位是0,那么结果就是1; ① 完成下图的代码; ② 使用快捷键F5进入调试模式; ③ 使用快捷键Ctrl+Alt+W,1,调出监视窗口; ④ 在监视窗口使用16进制显示; 由于16进制的每一位对应到2进制中就是4位,所以 对2进制的每一位取反,相对于16进制而言就是用16进制的F(10进制的15)减去当前位的值,所以 ① 由于-1的16进制是0xffffffff,所以对他的每一位取反就是: 等价于:0x(f-f)(f-f)(f-f)(f-f)(f-f)(f-f)(f-f)(f-f) 等价于:0x00000000 于是结果就是0 ② 由于 12345的16进制是 0x00003039: 等价于:0x(f-0)(f-0)(f-0)(f-0)(f-3)(f-0)(f-3)(f-9) 等价于:0xffffcfc6
- 03
下图显示了逻辑运算同算术运算的结果的差异
&
- 01
① 通过快捷键F1打开msdn; ② 输入 & Operator; ③ 在列表选项里面选择 bitwise Operator; 于是便打开了msdn对于按位求与运算符的解释;
- 02
按位求与运算符,如果第一个操作数与第二个操作数对应位置上的bit值都是1,那么对应位置的结果就是1,否则为假; 对于任何进制而言,如果某一位是0,那么与运算的结果就是0;对于16进制而言,如果某一位是F,那么运算结果就是另一个操作数对应的值; 下图的例子同时演示逻辑运算符&&和按位运算符&的使用区别; ① 由于-24的16进制是0xffffffe8, 34326的的16进制是0x00008616, 由于0xffffffe8的前6位都是f,所以结果的前6位是0x00008616的前6位; 0xe8对应的二进制是:1110 1000 0x16对应的二进制是:0001 0110 进制与操作结果是: 0000 0000 所以最终的结果是:0x0000 8600 ② 由于-24不为0,为真,所以在逻辑学里面可以用1代替; 同理 3436也可以用1来代替,于是 (-24 && 34326) 等价于 (1 && 1) 于是结果便是 1
|
- 01
① 通过快捷键F1打开msdn; ② 输入 | Operator; 于是便打开了msdn对于按位求或运算符的解释;
- 02
按位求或运算符,如果任一操作数的对应位为1,那么结果的对应位为1,否则为0; 对于任何进制而言,如果某一位是0,那么与运算的结果就是另一个操作数对应位的值;对于16进制而言,如果某一位是F,那么运算结果就F; 下图的例子同时演示逻辑运算符||和按位运算符|的使用区别; ① 123的16进制是0x0000007b, -14343的16进制是0xffffc7f9; 由于0x0000007b的前6位是0,所以结果的前6为是0xffffc7; 后两位 0x7b 的二进制:0111 1011 后两位 0xf9 的二进制:1111 1001 按位或的结果是: 1111 1011即16进制的0xfb 于是总的结果是:0xffffc7fb; ② 由于123不为0,为真,所以在逻辑学里面可以用1代替; 同理 -14343也可以用1来代替,于是 (-23&& -14343) 等价于 (1 || 1) 于是结果便是 1
^
- 01
下图是msdn对于按位异或的解释
- 02
按位异或将比较两个操作数中的每一位,如果一个操作数对应位是1,另一个操作数对应位是0,那么结果是1,否做结果是假; 对于任何进制而言,如果某一位是0,那么异或运算的结果就是另一个操作数对应位的值; 对于16进制而言,如果某一位是F,那么运算结果是另一操作数的反码(取反); 如下图由于: 123的16进制是0x0000007b, -14343的16进制是0xffffc7f9; 由于0x0000007b的前6位是0,所以结果的前6为是0xffffc7; 后两位 0x7b 的二进制:0111 1011 后两位 0xf9 的二进制: 1111 1001 按位或的结果是: 1000 0010的16进制的0x82 所以总的结果便是:0xffffc782
- 03
按位左移:左操作数的每一位向左移动右操作数位,高位舍弃,低位补0; 如下图的例子: ① 123 的16进制:0x0000007b 对应的二进制:0000 0000 0000 0000 0000 0000 0111 1011 向左移动三位:0000 0000 0000 0000 0000 0011 1101 1 000 换成16进制后结果:0x00 00 03 d8 ② ③ 同理 ④ -2140847327的16进制:0x80654321 对应的二进制:1000 0000 0110 0101 0100 0011 0010 0001 向左移动2位: 0000 0001 1001 0101 0000 1100 1000 01 00 换成16进制后结果:0x01 95 0c 84 通过一次左移运算,将 -2140847327 转成了正的 26545284
>>
- 01
右移运算相对于左移运算要复杂一下,右移运算分为两种: ① 无符号数的 逻辑右移运算; ② 有符号数的 算术右移运算;
- 02
无符号数的 逻辑右移运算 同左移运算一样,左操作数的每一位向右移动右操作数位,低位舍弃,高位补0; 如下图所示,由于 ① 123 的16进制:0x0000007b 对应的二进制:0000 0000 0000 0000 0000 0000 0111 1011 向左移动3位: 0000 0000 0000 0000 0000 0000 0000 1111 对应的16进制:0x00 00 00 0f ②的同理不再演示;
- 03
有符号数的称为算术右移,在进行移位的时候需要考虑符号位,左操作数的每一位向右移动右操作数位,低位舍弃,高位补 符号位(即二进制位的最高位); 注:正数的最高位是0,负数的最高位是1 ① 123 的16进制:0x0000007b 对应的二进制: 0000 0000 0000 0000 0000 0000 0111 1011 其对应的最高位是 0, 向左移动3位: 0000 0000 0000 0000 0000 0000 0000 1111 对应的16进制:0x00 00 00 0f ② -14343的16进制:0xffffc7f9 对应的二进制: 1111 1111 1111 1111 1100 0111 1111 1001 其对应的最高位是:1 想左移动4位后: 11111111 1111 1111 1111 1100 0111 1111 对应的16进制是:0xff ff fc 7f
- 04
方便他人亦是方便自己,如果觉得还行就点下 下边的 投票吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢!