C语言视频 VS2015:[20]位运算符

VisualStudio 2015的发布,跟随而来的相关的教程的空白,这里讲逐步在VisualStudio 2015上讲解C语言相关的系列视频教程经验(注:由于视频修改难度大,所以先暂时发布文档,视频后期逐步补上),本文主要涉及:
①按位取反位运算符:~
②按位求与位运算符:
③按位求或位运算符:|
④按位异或位运算符:^
⑤按位右移位运算符:
⑥按位左移位运算符:
简述
位运算符跟我们前面介绍的 逻辑运算符的运算逻辑是一致的,区别在于: ① 逻辑运算符是把整个操作数当做整体来判断,非0就是0,即可以等价替换成1来进行操作; 位运算符是把数据的二进制形式中每一位当做一个整体来进行处理; ② 逻辑运算符是宏观上的操作; 位运算符是微观上的操作 ;
按位取反位运算符 ~对应于 逻辑运算符 ! 按位求与位运算符 对应于逻辑运算符 按位求或位运算符 |对应于逻辑运算符 || 当然位运算符还多了三个运算符: 按位异或运算符 ^ 按位右移位运算符: 按位左移位运算符:
~
①通过快捷键F1打开msdn; ②输入 One's Complemet Operator; ③在列表选项里面选择 One's Complement Operator; 于是便打开了msdn对于按位取反运算符的解释; 注:在国外书籍或者msdn中把按位取反运算符称为“ 一的反码算子”有时候也称为“ 按位反码”,
对操作数的每一位进行反码操作,也就是说,对于每一位而言,如果这一位是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
下图显示了逻辑运算同算术运算的结果的差异

①通过快捷键F1打开msdn; ②输入 Operator; ③在列表选项里面选择bitwise Operator; 于是便打开了msdn对于按位求与运算符的解释;
按位求与运算符,如果第一个操作数与第二个操作数对应位置上的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
|
①通过快捷键F1打开msdn; ②输入| Operator; 于是便打开了msdn对于按位求或运算符的解释;
按位求或运算符,如果任一操作数的对应位为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
^
下图是msdn对于按位异或的解释
按位异或将比较两个操作数中的每一位,如果一个操作数对应位是1,另一个操作数对应位是0,那么结果是1,否做结果是假; 对于任何进制而言,如果某一位是0,那么异或运算的结果就是另一个操作数对应位的值; 对于16进制而言,如果某一位是F,那么运算结果是另一操作数的反码(取反); 如下图由于: 123的16进制是0x0000007b, -14343的16进制是0xffffc7f9; 由于0x0000007b的前6位是0,所以结果的前6为是0xffffc7; 后两位 0x7b的二进制:0111 1011 后两位 0xf9的二进制: 1111 1001 按位或的结果是: 10000010的16进制的0x82 所以总的结果便是:0xffffc782
按位左移:左操作数的每一位向左移动右操作数位,高位舍弃,低位补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
右移运算相对于左移运算要复杂一下,右移运算分为两种: ①无符号数的逻辑右移运算; ②有符号数的算术右移运算;
无符号数的逻辑右移运算同左移运算一样,左操作数的每一位向右移动右操作数位,低位舍弃,高位补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 ②的同理不再演示;

有符号数的称为算术右移,在进行移位的时候需要考虑符号位,左操作数的每一位向右移动右操作数位,低位舍弃,高位补 符号位(即二进制位的最高位); 注:正数的最高位是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
方便他人亦是方便自己,如果觉得还行就点下 下边的 投票吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢!

扩展阅读:真正免费的视频 ... cctv6在线直播 ... www.sony.com.cn ... c视频教程 ... javascript 在线 ... 跳舞 视频 ... 高清免费视频素材 ... 华清远见c语言入门视频 ... 免费 视频 素材 下载 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网