网站建设的概念,q a wordpress插件,保定网站制作设计哪个公司好,html购物网页设计目录 一.修炼必备
二. 位运算
二.移位运算符
三.位运算综合使用 恭喜你#xff0c;成功突破至筑基五层#xff01;#xff01;#xff01; 一.修炼必备 1.入门必备#xff1a;VS2019社区版#xff0c;下载地址#xff1a;Visual Studio 较旧的下载 - 2019、2017、201…目录 一.修炼必备
二. 位运算
二.移位运算符
三.位运算综合使用 恭喜你成功突破至筑基五层 一.修炼必备 1.入门必备VS2019社区版下载地址Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com) 2.趁手武器印象笔记/有道云笔记 3.修炼秘籍牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推求职就业一站解决_牛客网 (nowcoder.com) 4.雷劫必备leetcode 力扣LeetCode官网 - 全球极客挚爱的技术成长平台 注遇到瓶颈怎么办百度百科_全球领先的中文百科全书 (baidu.com) 二. 位运算 1.什么是位运算 ——位运算就是直接对整数在内存中的二进制位进行操作的运算 2.位运算操作符
位操作符特点 按位与 有0为0全1为1 |按位或有1为1全0为0^按位异或相同为0.不同为1~按位取反0变11变0注 1二进制的运算均是以补码进行运算的 2异或满足交换律和结合律 交换律num ^ 0 num; 0 ^ num num; 结合律num ^ a ^ a num; a ^ num ^ a num; //任何数和0异或等于本身相同数异或为0 3只有对整数才能进行位运算浮点数不能进行位运算 3.一个小case快速了解位运算符
#includestdio.hint main()
{int a7;int b4;//按位与int cab;//00000000 00000000 00000000 00000111 - a: 7//00000000 00000000 00000000 00000100 - b: 4//00000000 00000000 00000000 00000100 - ab: 4printf(%d %d %d\n,a,b,c);// 7 4 4//按位或ca|b;//00000000 00000000 00000000 00000111 - a: 7//00000000 00000000 00000000 00000100 - b: 4//00000000 00000000 00000000 00000111 - a|b: 7 printf(%d | %d %d\n,a,b,c);// 7 | 4 7//按位异或ca^b;//00000000 00000000 00000000 00000111 - a: 7//00000000 00000000 00000000 00000100 - b: 4//00000000 00000000 00000000 00000011 - a^b: 3printf(%d ^ %d %d\n,a,b,c);// 7 ^ 4 3//按位取反c ~a;//00000000 00000000 00000000 00000111 - a: 7//11111111 11111111 11111111 11111000 - ~a补码)//11111111 11111111 11111111 11110111 - 反码//10000000 00000000 00000000 00001000 - 原码打印的是原码-8printf(~%d %d\n, a, c);//~7 -8return 0;
} 4.常用的位操作符 1判断奇偶性 奇数(num 1) 1 等价于 num % 2 1 偶数(num 1) 0 等价于 num % 2 0 注为什么num1要加括号 —— 的优先级比的优先级高 #include stdio.hint main()
{int num 0;scanf(%d, num);//若是想要使用num 1 1则需要使用括号括上(num 1) 1if (num 1){printf(%d是奇数\n, num);}else{printf(%d是偶数\n, num);}return 0;
} 2计算二进制中有几个1num num (num -1)
#include stdio.hint getOneCount(int num)
{int count 0;while (num){num num (num - 1);count;//测试用例17//00000000 00000000 00000000 00000111 : 7//00000000 00000000 00000000 00000110 : 6//00000000 00000000 00000000 00000110 : 6 :结果//00000000 00000000 00000000 00000101 : 5//00000000 00000000 00000000 00000100 : 4: 结果//00000000 00000000 00000000 00000011 : 3//00000000 00000000 00000000 00000000 : 0: 结果 --跳出循环//测试用例210//00000000 00000000 00000000 00001010 : 10//00000000 00000000 00000000 00001001 : 9//00000000 00000000 00000000 00001000 : 8: 结果//00000000 00000000 00000000 00000111 : 7//00000000 00000000 00000000 00000111 : 0: 结果 --跳出循环}return count;
}int main()
{int num 0;scanf(%d, num);int count getOneCount(num);//计算1的个数printf(%d的二进制中有%d个1\n, num, count);return 0;
} 3num -num得到二进制的最低位的1不一定是最后一位
#include stdio.hint main()
{int num 0;scanf(%d, num);int ret num -num;printf(%d -%d %d\n, num, num, ret);//说明二进制的运算均是以补码进行的//测试案例17//10000000 00000000 00000000 00000111 --原码 -7//11111111 11111111 11111111 11111000 --反码//11111111 11111111 11111111 11111001 --补码//00000000 00000000 00000000 00000111 --补码 7//00000000 00000000 00000000 00000001 -- 1 结果//测试用例2 10//10000000 00000000 00000000 00001010 --原码 -10//11111111 11111111 11111111 11110101 --反码//11111111 11111111 11111111 11110110 --补码//00000000 00000000 00000000 00001010 --补码 10//00000000 00000000 00000000 00000010 --2 结果return 0;
} 4num ~num0
#include stdio.hint main()
{int num 0;scanf(%d, num);int ret num ~num;printf(%d ~%d %d\n, num, num, ret);//测试用例13//00000000 00000000 00000000 00000011 3//11111111 11111111 11111111 11111100 ~3//00000000 00000000 00000000 00000000 0 结果//测试用例24//00000000 00000000 00000000 00000100 4//11111111 11111111 11111111 11111011 ~4//00000000 00000000 00000000 00000000 0 结果return 0;
} 5低位首0变1num | (num1)
#include stdio.hint main()
{int num 0;scanf(%d, num);int ret num | (num 1);printf(%d | %d %d\n, num, num 1, ret);//测试用例15//00000000 00000000 00000000 00000101 5//00000000 00000000 00000000 00000110 6//00000000 00000000 00000000 00000111 : 7 -- 低位首0变1//测试用例29//00000000 00000000 00000000 00001001 9//00000000 00000000 00000000 00001010 10//00000000 00000000 00000000 00001011 11 -- 低位首0变1return 0;
} 6求num的相反数~num 1
#include stdio.hint main()
{int num 0;scanf(%d, num);int ret ~num 1;printf(%d\n, ret);//测试用例15//11111111 11111111 11111111 11111010 ~5//11111111 11111111 11111111 11111011 ~5 1 补码//11111111 11111111 11111111 11111010 反码//10000000 00000000 00000000 00000101 原码 -- -5//测试用例2-5//10000000 00000000 00000000 00000101 原码//11111111 11111111 11111111 11111010 反码//11111111 11111111 11111111 11111011 补码//00000000 00000000 00000000 00000100 ~-5//00000000 00000000 00000000 00000101 ~-5 1 -- 5结果return 0;
} 7判断数是不是2的幂num (num-1) 0
#include stdio.hint main()
{int num 0;scanf(%d, num);if ((num (num - 1)) 0){printf(%d是2的幂\n, num);}else{printf(%d不是2的幂\n, num);}//测试案例12//00000000 00000000 00000000 00000010 :2//00000000 00000000 00000000 00000001 :1//00000000 00000000 00000000 00000000 :0 -- 结果//测试用例28//00000000 00000000 00000000 00001000 : 8//00000000 00000000 00000000 00000111 : 7//00000000 00000000 00000000 00000000 : 0 --结果return 0;
} 8异或应用变量交换
#include stdio.hint main()
{int a 0;int b 0;scanf(%d %d, a, b);//交换变量a a ^ b;b a ^ b;a a ^ b;printf(%d %d\n, a, b);return 0;
} 二.移位运算符 1.什么是移位运算符 ——在C语言中使用和对数的二进制位进行向左移动和向右移动而和称为移位运算符 2.移位操作符
移位操作符特点左边丢弃右边补0 算术右移右边丢弃左边补符号位 逻辑右移右边丢弃左边补0 二进制位进行移位的时候不要移动负数位因为这个标准是未定义的 3.一个小case快速了解移位操作符
#include stdio.hint main()
{int num 7;int ret num 2;//00000000 00000000 00000000 00000111 num//000000 00000000 00000000 0000011100 num 2 :28printf(%d\n, ret);//28ret num 2;//00000000 00000000 00000000 00000111 num//注我们在这个地方进行的是算术右移现在大多数编译器都是进行算术右移的//0000000000 00000000 00000000 000001 num 2 1printf(%d\n, ret);//1return 0;
} 4.常用的移位操作 1num 1 等价于 num / 2
#include stdio.hint main()
{int num 0;scanf(%d, num);int ret num 1;int res num / 2;//测试案例110//00000000 00000000 00000000 00001010 num: 10//00000000 00000000 00000000 00000101 num 15//num / 2 5//测试案例215//00000000 00000000 00000000 00001111 num15//00000000 00000000 00000000 00000111 num 17//num / 2 7if (ret res){printf(num1和num/2相等\n);}else{printf(num1和num/2不相等\n);}return 0;
} 2去掉num的低x位从最低位一直到x位num x
#include stdio.hint main()
{int num 0;scanf(%d, num);int ret num 3;//去掉低三位//00000000 00000000 00000000 00001111 num15//00000000 00000000 00000000 00000001 num1printf(%d\n, ret);//1ret num 2;//去掉低两位//00000000 00000000 00000000 00001111 num15//00000000 00000000 00000000 00000011 num3printf(%d\n, ret);//3return 0;
} 三.位运算综合使用 注规定我的最低位是从1开始最高位是32 1.获取num二进制位的第n位值(num n) 1
#include stdio.hint main()
{int num 0;scanf(%d, num);int ret (num 3) 1;printf(%d\n, ret);//测试案例15//00000000 00000000 00000000 00001111 num15//00000000 00000000 00000000 00000001 num 3//00000000 00000000 00000000 00000001 (num 3) 1//00000000 00000000 00000000 00000001 1return 0;
} 2.将num的第n1位置为1num | (1 n)
#include stdio.hint main()
{int num 0;scanf(%d, num);//将num的第4位置为1int ret num | (1 3);printf(%d\n, ret);//测试案例5//00000000 00000000 00000000 00000101//00000000 00000000 00000000 00001000 1 3//00000000 00000000 00000000 00001101 13return 0;
} 3.将num的第n1位置为0num (~(1 n))
#include stdio.hint main()
{int num 0;scanf(%d, num);//将num的第3位置为0int ret num (~(1 2));printf(%d\n, ret);//测试案例5//00000000 00000000 00000000 00000100 1 2//11111111 11111111 11111111 11111011 ~(1 2) 补码//00000000 00000000 00000000 00000101 : 5//00000000 00000000 00000000 00000001 : num (~(1 2))return 0;
} 4.获取num的第n1位的幂值num (1 n)
#include stdio.hint main()
{int num 0;scanf(%d, num);//获取num第3位的幂值int ret num (1 2);printf(%d\n, ret);//测试案例 5//00000000 00000000 00000000 00000101 5//00000000 00000000 00000000 00000100 1 2//00000000 00000000 00000000 00000100 num (1 2): 4//测试案例 8//00000000 00000000 00000000 00001000 8//00000000 00000000 00000000 00000100 1 2//00000000 00000000 00000000 00000000 num (1 2): 0return 0;
} 5.将num的最高位到n1位置为0num ((1 n) - 1)
#include stdio.hint main()
{int num 0;scanf(%d, num);//将num的最高位到第4位置为0int ret num ((1 3) - 1);printf(%d\n, ret);//测试案例121//00000000 00000000 00000000 01111001 :121//00000000 00000000 00000000 00000111 : 1 3 - 1//00000000 00000000 00000000 00000001 : 7return 0;
} 6.将num的第1位到第n1位置为0num (~((1 (n 1)) - 1))
#include stdio.hint main()
{int num 0;scanf(%d, num);//将num的第0位到第3位置为0int ret num (~((1 (2 1)) - 1));printf(%d\n, ret);//测试案例 121//00000000 00000000 00000000 00000111 (1 (2 1) - 1)//11111111 11111111 11111111 11111000 ~(1 (2 1) - 1)//00000000 00000000 00000000 01111001 :121//00000000 00000000 00000000 01111000return 0;
} 7.代替减法进行两数相减x ~y 1
#include stdio.hint main()
{int x 0;int y 0;scanf(%d %d, x, y);int ret x ~y 1;printf(%d - %d %d\n, x, y, ret);//测试案例x 5, y 3//00000000 00000000 00000000 00000011 y//11111111 11111111 11111111 11111100 ~y//00000000 00000000 00000000 00000101 x//00000000 00000000 00000000 00000001 x ~y 1//00000000 00000000 00000000 00000010 x ~y 1 2//测试案例 x 3, y 5//00000000 00000000 00000000 00000101 y//11111111 11111111 11111111 11111010 ~y//00000000 00000000 00000000 00000011 x//11111111 11111111 11111111 11111101 x ~y//11111111 11111111 11111111 11111110 x ~y 1 补码//11111111 11111111 11111111 11111101 反码//10000000 00000000 00000000 00000010 原码 -2return 0;
} 8.代替加法进行两数相加x - ~y - 1
#include stdio.hint main()
{int x 0;int y 0;scanf(%d %d, x, y);int sum ~y;int ret x - ~y - 1;printf(%d %d %d\n, x, y, ret);//测试案例x 5, y 3//00000000 00000000 00000000 00000011 y//00000000 00000000 00000000 00000101 x//11111111 11111111 11111111 11111100 ~y//00000000 00000000 00000000 00001001 x - ~y//00000000 00000000 00000000 00001000 x - ~y - 1: 8return 0;
} 注位运算的基本常用的操作就在这点了但是远不止这点需要我们更加努力的学习和探索位运算的奥妙。 注若是觉得CSDN看起来很难受的话请去有道云看我写的原文排版更好 链接在此有道云笔记 恭喜你成功突破至筑基五层