移位操作符和位操作符
发布时间:2026/11/4 12:15:15 锦皓数字建站

移位操作符左移操作符左边抛弃右边补0a b重点结果 a * 2 ^b#define _CRT_SECURE_NO_WARNINGS 1 # include stdio.h int main() { int a 10; // 00000000 00000000 00000000 00001010 // 0000000 00000000 00000000 000010100 int r a 1; printf(r %d\n, r);// a * 2^1 20 printf(a %d\n, a);//10 return 0; }右移操作符:a b警告1.不要移动负号位标准位定义 num -1;2.移动范围[0, type_width-1], type_width是类型二进制宽度#define _CRT_SECURE_NO_WARNINGS 1 # include stdio.h int main() { unsigned int num 10; unsigned int n num 1; printf(n %u\n, n);// num / 2^1 5 printf(num %u\n, num);// 10 return 0; }位操作符补充负数源码转反码转补码符号位不动取反再加1在补码转源码依然适用练习判断一个数字在内存中有几个1// 方案1取模 除法 统计二进制1的个数 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h int main() { unsigned int num 1; int count 0; scanf(%d, num); // 只要二进制还有1就循环 while (num) { // 对2取余二进制最低位是1%2结果就是1最低位是0%2结果就是0 if (num % 2 1) count; // num / 2二进制整体右移1位丢掉最低位 num / 2; } printf(%d, count); return 0; }// 方案2移位 按位与 遍历全部32bit #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h int main() { unsigned int num 1; scanf(%d, num); int count 0; // unsigned int一共32个二进制位i代表二进制位下标从第0位最低位到31位 for (int i 0; i 32; i) { // num i二进制向右移动i位把第i位移到最右边 // 1二进制按位与 0b000...0001只保留最右边那一位 if (((num i) 1) 1) count; } printf(%d, count); return 0; }// 方案3n (n-1) 消1法最难理解面试高频 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h int main() { unsigned int num 0;//32bit short tmp 0;// 16bit scanf(%hd, tmp);// tmp 可用来接收 负数 例如 输入-2 // 隐式转换公式结果 原值 k * 2^n // n 是【目标无符号类型unsigned int】的bit位数32不是源short的16bit // k是整数系数挑选k使得最终结果落在 [0 , 2^n - 1] // 示例tmp -2取k1num -2 1 * 2^32 4294967294 num tmp; int count 0; while (num) { count; num num (num - 1); } printf(%d\n, count); return 0; }拓展:判断一个数字是不是2的次幂#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h int main() { int n 0; scanf(%d, n); if(n 0 (n (n - 1)) 0) { printf(n是2的幂次方数); } return 0; }练习编写代码将13的二进制序列第五位先改成1然后再改成0#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h int main() { int a 13; a a | (1 4); printf(%d\n, a); a a ~(1 4); printf(%d\n, a); return 0; }
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。