C 【位运算符 & | ^ ~ << >>】
来源:互联网 发布:淘宝下载器 编辑:程序博客网 时间:2024/05/23 01:15
#include <stdio.h>int main(int argc, const char * argv[]) { // 按位与 printf("2 & 9 = %i\n", 2 & 9); // 0 // 按位或 printf("2 | 9 = %i\n", 2 | 9); // 11 // 按位异或 printf("2 ^ 9 = %i\n", 2 ^ 9); // 11 // 取反 printf("~ 11 = %i\n", ~ 11); // -12 printf("~ 9 = %i\n", ~ 9); // -10 printf("~ -9 = %i\n", ~ -9); // 8 /* << 左移 a << n 把整数a的二进制位往左边移n位 移出的位砍掉,低位补0, 发现左移会把原有的数值变大 9 << 1 = 18 9 * 2(1) = 18 9 << 2 = 36 9 * 2(2) = 36 9 << n = 9 * 2(n) 左移的应用场景:当要计算某个数乘以2的n次方的时候就用左移,效率最高 0000 0000 0000 0000 0000 0000 0000 0000 100 0000 0000 0000 0000 0000 0000 10010 注意点:左移有可能改变数值的正负性(因为左移会砍掉符号位) */ /* >> 右移 a >> n 把整数a的二进制位往右边移n位 移出的位砍掉, 缺少的一位最高位是0就补0是1就补1(是在当前操作系统下) ??? 9 >> 1 = 4 9 / 2(1) = 4 9 >> 2 = 2 9 / 2(2) = 2 右移的应用场景:当要计算某个数除以2的n次方的时候就用右移,效率最高 0000 0000 0000 0000 0000 0000 0000 0000 000000 0000 0000 0000 0000 0000 0000 10 */ int result1 = -19 << 2; //????? /** -19 ---> 1000 0000 0000 0000 0000 0000 0001 0011(原码) ---> 1111 1111 1111 1111 1111 1111 1110 1100(反码) ---> 1111 1111 1111 1111 1111 1111 1110 1101(补码) ---> 11 1111 1111 1111 1111 1111 1110 1101 00(左移两位) ---> 1111 1111 1111 1111 1111 1111 1011 0100(整理一下) ---> 1111 1111 1111 1111 1111 1111 1011 0011(反码) ---> 1000 0000 0000 0000 0000 0000 0100 1100(原码) ---> - 76 */ int result2 = 21 >> 3; /** 21 ---> 0000 0000 0000 0000 0000 0000 0001 0101(原码) ---> 000 0000 0000 0000 0000 0000 0000 0001 0(补码==原码 直接移位) ---> 0000 0000 0000 0000 0000 0000 0000 0010(整理一下) ---> 2 */ printf("result1 = %d\nresult2 = %d\n", result1, result2); return 0;}/* 位运算都是针对二进制的(把他们的二进制数进行运算) 按位 与 & 有假则假(对应数位比较) 按位 或 | 有真则真 按位 异或 ^ 不同为1,相同为0 按位 取反 ~ 先将其补码取反,再计算出新的原码 按位异或 注意几点: 1、多个整数按位异或的结果和顺序无关 9 ^ 6 ^ 3 == 3 ^ 9 ^ 6 2、相同整数按位异或结果是0 8 ^ 8 == 0 3、任何整数按位异或上0结果不变 2 ^ 0 == 2 4、任何整数按位异或上另一个整数两次结果还是那个数 1 ^ 7 ^ 7 == 1 ^ (7 ^ 7) == 1 ^ 0 == 1 按位取反: ~ 11 = ~[0000 0000 0000 0000 0000 0000 0000 1011] 原码/反码/补码 = [1111 1111 1111 1111 1111 1111 1111 0100] 补码取反结果(连符号位也变了!!!!!!!!!!!!) = [1111 1111 1111 1111 1111 1111 1111 0011] 反码 = [1000 0000 0000 0000 0000 0000 0000 1100] 原码 = -12 ~ 9 = ~[0000 1001] 原码/反码/补码 = [1111 0110] 补码取反结果 = [1111 0101] 反码 = [1000 1010] 原码 = -10 ~ -9 = ~[1000 1001] = ~[1111 0110] = ~[1111 0111] = [0000 1000] = 8 问题1:不通过第三个变量,交换两个变量的值 a = a ^ b; b = a ^ b; a = a ^ b; 问题2:通过运算符判断一个数字的奇偶性(奇数的二进制表示末尾为1,偶数二进制数表示末尾为0) if ((number & 1) == 1) // 如果该数 return "奇数"; else return "偶数"; */
0 0
- 【C++】位运算符
- 【C++】位运算符
- C 位运算符
- C 【位运算符 & | ^ ~ << >>】
- Objective-C位运算符-Objective-C 位运算符
- C中的 "<<" 位运算符
- 位运算符C语言
- c语言位运算符
- 位运算符C语言
- Objective-C位运算符
- C语言位运算符
- c语言位运算符
- C语言位运算符
- 位运算符C语言
- C语言位运算符
- c语言位运算符
- c语言:位运算符
- C语言位运算符
- 常用的基本进制转换与自动装箱拆箱
- 13. Roman to Integer
- mysql排序让空值NULL排在数字后边
- 页面间跳转的性能优化(一)
- fzu 养鸡场
- C 【位运算符 & | ^ ~ << >>】
- CSS对齐&尺寸&分类&导航栏
- 为知笔记登录提示“打开数据库失败”解决方法
- C#同一项目中一个窗口中的按钮去操控另一个窗口控件
- 英文歌曲:cross every river( 穿过每一条河 )
- js设置、修改、获取、删除 cookie
- 基于EasyDarwin 流媒体播放器的客户端开发
- Character类
- python中的三个读read(),readline()和readlines()