公司网站建设知乎,腾讯企业网站建设,网站建设维护及使用管理办法,网线制作的过程在C语言中#xff0c;移位操作符和位操作符是专门针对二进制的数字进行#xff0c;因此#xff0c;在描述移位操作符和位操作符之前#xff0c;我们先来了解十进制#xff0c;二进制#xff0c;八进制#xff0c;十六进制等的含义以及相互之间的转化。
一.进制以及相互…
在C语言中移位操作符和位操作符是专门针对二进制的数字进行因此在描述移位操作符和位操作符之前我们先来了解十进制二进制八进制十六进制等的含义以及相互之间的转化。
一.进制以及相互的转化
十进制二进制八进制十六进制等只是数值的不同表示形式十进制就是逢10进1位二进制就是逢2进1以此类推。
十进制每个位置上的值的范围是0-9二进制是0-1那么他们是如何进行转化的呢
1.二进制转化为十进制
首先来看我们是怎么读出十进制的数字的实际上例如123我们是运用了 这样的计算方法来获得答案的3对应的是10的0次方2×10的一次方以此类推最后求和即可
那么我们想把二进制数字转换为十进制的数字实际上也可以运用这样的计算方法只不过是改成成了✖2的多少次方。
例如我们求二进制数字1101转换为十进制的数字 如果我们想将一个八进制数字转换为十进制数字也是非常简单的 2.十进制转换为二进制
例如我们要将十进制数字125转换为二进制数字我们运用这样的方法
1.将十进制数字除以2保留整数部分将余数写在后面
2.一直进行1过程直到为0
3.余数按反向书写即可获得二进制数字 3.二进制转化为八十六进制
从右向左三个为一组无法组成一组就单独进行计算例如二进制数字1011101转换为八进制数字我们是这样做的 转化为十六进制的时候从右向左四个为一组即可
需要注意十六进制每个位置的范围是0~F包括0~9A~FA是10F是15
确定八进制的数字时候前面加0例如023就是八进制的数字十六进制前面加0x或0X十六进制的符号大小写与x的相同
5.八十六进制转化为二进制
只需要二进制转化的反向进行转化即可
二.原码反码补码
三者描绘的都是整数
由于int类型是4个字节32个bit每个bit位置可以存放1个二进制数字但是只有31位可以放大小最开头的一位放入的数字表示正负
原码整数的二进制表示其中我们知道数字分为正数和负数因此我们需要额外来表示正负如果数字为正数的时候原码的符号位位0负数则符号位为1
反码补码正数的反码和补码与原码一样
负数的反码负数的原码除了符号位所有位置取反如果原位置是1现在改为0
负数的补码负数的反码1
转化过程如图
事实上原码可以经过取反1变为补码补码也可以通过取反1变为原码
我们在运算的时候统一使用的都是补码来进行运算
三.移位操作符
移位操作符分为左移操作符 右移操作符
书写方法是 a 移位的数量例如
int b a 2;
1.左移操作符的移动规律
采用二进制数字全部左移空位补0的方法例如我们写出10的补码以 现在向左移位空位补0超出范围的去掉 我们会发现最后得到的结果是20因为向左移动代表着*2
负数也是如此不过记得移动的是补码移动后也是补码
2.右移操作符的移动规律
一般来说采用数字移动的规律就是全部右移然后空位补符号位的数字
四.位操作符
位操作符分为 1.按位与
两个数字的补码的二进制数字在某一个位置上都为1时才为1只要有0则位0例如
int a 4; //00000000000000000000000000000100 4补码
int b -7; //11111111111111111111111111111001 -7补码//00000000000000000000000000000000
我们发现此时没有相同的故ab 0
2.按位或|:
对应位置有1就是1都0才是0例如
int a 4; //00000000000000000000000000000100 4补码
int b -7; //11111111111111111111111111111001 -7补码//11111111111111111111111111111101 a|b的补码 //10000000000000000000000000000011 还原为原码//-3
一定要记得获得的是补码哦
3.按位异或^:
相同为0想异为1
int a 4; //00000000000000000000000000000100 4补码
int b -7; //11111111111111111111111111111001 -7补码//11111111111111111111111111111101//-3
4.按位取反~
所有位置变为与原本不同的数
五.例题
1.不创建临时第三个变量实现整数交换
我们在实现整数交换时运用的是这种方法
int main() {int a 3;int b 5;int c 0;c a;a b;b c;printf(%d %d, a, b);return 0;
}假设有两个瓶子分别装了醋和酱油现在让两个瓶子里面的东西反过来我们额外拿来了一个瓶子然后进行了操作。
但在这个题目中他让我们不创建临时变量也就是不能额外拿来一个瓶子实现整数的交换
我们可以采用这种方法
int main() {int a 3;int b 5;//当a与b特别大的时候超过最大值出现位数丢失溢出a a b; //a 8 b 5b a - b; //b 3 a 8a a - b; //a 5 a 3printf(%d %d, a, b);return 0;
}
这样就可以交换a与b的值了但是如果a与b两个整数非常大的时候我们想加可能超过最大的范围因此这个方法有一定的局限性
我们在之前学习了^,它有如下的式子 a ^
a 0,因为两者完全相同同时 a ^ 0 a我们可以写出如下的代码
int main() {int a 3;int b 5;a a ^ b;b a ^ b; // a ^ b ^ b aa a ^ b; // a ^ b ^ a bprintf(%d %d, a, b);return 0;
}
在这里我们将a ^ b 视为了一个整体进行的运算 2.计算一个数字的二进制数的1的数量
如果一个数字%2等于1此时它的二进制数字的最后一位为1我们可以写出如下的函数
int count(unsigned int m) {int num 0;if (m % 2) num;m / 2;return num;
}
其中m要是unsigned int类型因为m传进去是一串二进制数如果是负数还需要单独判断此时我们将他们统一视为了正数进行的判断
当然我们也可以通过移位操作符来判断每一位上是否为1写出如下的函数
int count1(unsigned int m) {int count 0;int i 0;for (i 0; i 32; i) {if (((m i) 1) 1)count;}return count;
}
使得m不断向右移动来计算
同时n n ^ (n-1)的方法可以更快的进行运算函数如下
// n n (n-1) 让n的二进制中最右边的1消失
// n 0时执行几次就是有几个1 有几个1统计几次
int count2(unsigned int m) {int count 0;while (m) {count;m m (m - 1);}return count;
}感谢您的观看 如果您想要进行进一步的训练请移步 C语言进制习题-CSDN博客