石家庄房和城乡建设部网站,wordpress内容模板,微信管理软件,帝国cms 企业网站C语言中的移位操作符、位操作符 #x1f391;储备知识#xff1a;原码、反码、补码移位操作左移操作符#xff1a;右移操作符#xff1a; 位操作符按位与#xff1a;按位或|#xff1a;异或^:特点#xff1a; 经验积累#xff1a;1把整数a中某个二进制位改… C语言中的移位操作符、位操作符 储备知识原码、反码、补码移位操作左移操作符右移操作符 位操作符按位与按位或|异或^:特点 经验积累1把整数a中某个二进制位改成1、再改回来2统计二进制补码中1的个数判断二进制补码中最低位是否为1获得二进制位中最低位获得二进制中每一位3判断一个数是不是2的k次方 储备知识原码、反码、补码
1、 整数的二进制表示方式原码、反码、补码 具体关系 这里我们不去深究原码、反码、补码只需明白一下几点 1这里的原、反、补都是就整数而言我们不考虑小数 2、移位操作符的操作数都是整数也不考虑小数 3、正数的原码、反码、补码相同 4、在进行算术运算包括下面讲解的移位操作、位操作都是就补码而言 5由补码得到原码和由原码得到补码的路径相同先取反后加1 移位操作
左移操作符
操作规则左边丢弃右边补0 图解
右移操作符
注意和左移不太一样的是右移操作分为两种 1算术右移右边丢弃左边补符号位常见绝大多数编译器采用
#includestdio.h
int main()
{printf(%d, -1 2);return 0;
}这里可以看到vs2019的编译器是进行算术右移的 2逻辑右移右边丢弃左边补0 位操作符 再次强调位操作符也是只对整数进行即操作数是整数 按位与
规则对补码二进制相同位置上全为1则为1有0则为0和有点像但是这是对于补码来说的 按位或|
规则对补码二进制位相同位置上有1则为1全0为0
异或^:
规则对补码对应二进制位上相同则为0不同则为1和|不同的就是1^1为0
特点 假设a为一个整数 10^aa; 2, a^a0; 3异或支持交换律,即a ^ a ^ ba ^ b ^ a; 理解方法/记忆方法把a^b想象成一个密码c如果c ^ a得到b,如果c ^ b得到a.(比如我们想把b中数据藏起来那么我们把b和a异或这个a只有自己知道如果想得到b中数据必须把这个密码和a异或但这个a只有自己知道是不是很6
eg:不创建临时变量实现两个数的交换。
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
int main()
{int a 3;int b 4;printf(交换前a%d,b%d\n, a, b);a a ^ b;b a ^ b;a a ^ b;printf(交换后a%d,b%d\n, a, b);return 0;
}注意实际开发过程中异或操作符交换两个变量效率 并不高并且只争对整数。
经验积累
1把整数a中某个二进制位改成1、再改回来 方法把二进制中某个二进制位改成1 int main()
{int a 9;int n 0;printf(把a二进制位中从左向右第几位改成1);scanf(%d, n);int change a | (1 n);printf(%d, change);return 0;
}改成1后再改回来 2统计二进制补码中1的个数判断二进制补码中最低位是否为1获得二进制位中最低位获得二进制中每一位
假设只考虑32位我们这里说的是指可以借鉴这种思想方法1将这个数按位与上一个1如果结果是1则该数二进制最低位为1如果结果是0则该数最低位是0 eg: 但是这里是要统计的32位没关系。只需要统计完一次将a像右移动1位再进行判断计数即可。 代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
int TheNumOf1(int n)
{int i 0;int count 0;for (i 0; i 32; i){if (((n i) 1) 1)//key{count;}}return count;
}int main()
{int n 0;scanf(%d, n);int retTheNumOf1(n);printf(%d, ret);return 0;
}方法2nn(n-1) 解释每次执行一次这个表达式n二进制最右边的1会被丢弃直至n中所有1都被丢弃此时n0。所以这个表达式执行的次数就是n二进制补码中1的个数 图解 代码实现 #define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
int TheNumOf1(int n)
{int count 0;while (n)//当n0说明n二进制位中所有1都没了{n n (n - 1);//keycount;}return count;
}int main()
{int n 0;scanf(%d, n);int retTheNumOf1(n);printf(%d, ret);return 0;
}3判断一个数是不是2的k次方 方法如果一个数是2的k次方那么二进制表达形式中就只有一个1–转换为统计二进制位中1的个数用(nn(n-1))0),如果表达式成立说明n是2的k次方。