网站开发做什么简单,wordpress列表页调用图片,DW做网站的步骤,做美食网站的目的和意义文章目录 1.操作符的分类2.⼆进制和进制转换3.原码、反码、补码4.移位操作符4.1 左移操作符4.2 右移操作符 5.位操作符#xff1a;、|、^、~5.1 #xff1a;按位与5.2 |#xff1a;按位或5.3 ^#xff1a;按位异或5.4 ~#xff1a;按位取反5.5 例题例题1例题2例… 文章目录 1.操作符的分类2.⼆进制和进制转换3.原码、反码、补码4.移位操作符4.1 左移操作符4.2 右移操作符 5.位操作符、|、^、~5.1 按位与5.2 |按位或5.3 ^按位异或5.4 ~按位取反5.5 例题例题1例题2例题3例题4 1.操作符的分类 算术操作符 、- 、* 、/ 、% 移位操作符: , 位操作符: , |, ^ 赋值操作符: 、 、 - 、 * 、 / 、% 、 、 、 、| 、^ 单目操作符 、、--、、*、、-、~ 、sizeof、(类型) 关系操作符: 、 、 、 、 、 ! 逻辑操作符 、|| 条件操作符 ? : 逗号表达式 , 下标引用 [] 函数调用 () 结构成员访问 . 、- 2.⼆进制和进制转换
进制转换的教程网上比比皆是而且视频看起来肯定比文字清晰。这里就不过多赘述了。
我们需要掌握一下几个
2进制转10进制10进制转2进制2进制转8进制和16进制8进制和16进制转2进制8进制转16进制16进制转8进制 3.原码、反码、补码
整数的2进制表示方法有三种 原码 反码 补码
有符号整数的三种表示方法均有符号位和数值位两部分2进制序列中最高位的1位是被当做符号位剩余的都是数值位。
符号位都是用0表示“正”用1表示“负”。
正整数的原、反、补码都相同。
原码直接将数值按照正负数的形式翻译成二进制得到的就是原码。
反码正数反码和原码一样。
补码正数补码和原码一样。
负整数的三种表示方法各不相同。
原码直接将数值按照正负数的形式翻译成二进制得到的就是原码。注意符号位
反码将原码的符号位不变其他位依次按位取反就可以得到反码。
补码反码1就得到补码。 4.移位操作符 只有整数才能运用移位操作符。 4.1 左移操作符
例1
#include stdio.h
int main()
{int num 10;int n num1;//10补码: 00000000 00000000 00000000 00001010//101补码:0 00000000 00000000 00000000 00010100//这里最前面的0被丢掉了printf(n %d\n, n);printf(num %d\n, num);return 0;
}打印
n 20
num 10例2
#include stdio.h
int main()
{int num -1;int n num1;//-1原码 10000000 00000000 00000000 00000001//-1反码 11111111 11111111 11111111 11111110//-1补码 11111111 11111111 11111111 11111111
//-11补码0 11111111 11111111 11111111 11111110//这里最前面的0被丢掉了printf(n %d\n, n);printf(num %d\n, num);return 0;
}打印
n -2
num -14.2 右移操作符
右移运算分两种 逻辑右移左边用0填充右边丢弃。 算术右移左边用原该值的符号位填充正数左边补0负数左边补1右边丢弃。 右移是算术右移还是逻辑右移是取决于编译器的。通常采用的都是算数右移。
例1
#include stdio.h
int main()
{int num -10;//-10原码10000000 00000000 00000000 00001010//-10反码11111111 11111111 11111111 11110101//-10补码11111111 11111111 11111111 11110110//逻辑右移01111111 11111111 11111111 11111011 |0(这个0被丢弃了)//算术右移11111111 11111111 11111111 11111011 |0(这个0被丢弃了)//这里采用算数右移//右移补码11111111 11111111 11111111 11111011//右移反码10000000 00000000 00000000 00000100//右移原码10000000 00000000 00000000 00000101----5int n num1;printf(n %d\n, n);printf(num %d\n, num);return 0;
}打印
n -5
num -105.位操作符、|、^、~
双目操作符
按位与|按位或^按位异或
单目操作符
~按位取反
5.1 按位与
有0则0。
#include stdio.h
int main()
{int a 6;// 6的补码00000000 00000000 00000000 00000110int b -7;//-7的原码10000000 00000000 00000000 00000111//-7的反码11111111 11111111 11111111 11111000//-7的补码11111111 11111111 11111111 11111001int c a b;// 6的补码00000000 00000000 00000000 00000110//-7的补码11111111 11111111 11111111 11111001//a b补码00000000 00000000 00000000 00000000--0printf(n %d\n, c);return 0;
}打印
n 05.2 |按位或
有1则1。
#include stdio.h
int main()
{int a 6;// 6的补码00000000 00000000 00000000 00000110int b -7;//-7的原码10000000 00000000 00000000 00000111//-7的反码11111111 11111111 11111111 11111000//-7的补码11111111 11111111 11111111 11111001int c a | b;// 6的补码00000000 00000000 00000000 00000110//-7的补码11111111 11111111 11111111 11111001//a | b补码11111111 11111111 11111111 11111111//a | b反码10000000 00000000 00000000 00000000//a | b原码10000000 00000000 00000000 00000001---1printf(n %d\n, c);return 0;
}打印
n -15.3 ^按位异或
相同为0不同为1。
#include stdio.h
int main()
{int a 6;// 6的补码00000000 00000000 00000000 00000110int b -7;//-7的原码10000000 00000000 00000000 00000111//-7的反码11111111 11111111 11111111 11111000//-7的补码11111111 11111111 11111111 11111001int c a ^ b;// 6的补码00000000 00000000 00000000 00000110//-7的补码11111111 11111111 11111111 11111001//a ^ b补码11111111 11111111 11111111 11111111//a ^ b反码10000000 00000000 00000000 00000000//a ^ b原码10000000 00000000 00000000 00000001---1printf(n %d\n, c);return 0;
}打印
n -15.4 ~按位取反
按2进制位取反
#include stdio.h
int main()
{int a 0;//0的原码00000000 00000000 00000000 00000000//~a补码 11111111 11111111 11111111 11111111//~a反码 10000000 00000000 00000000 00000000 //~a原码 10000000 00000000 00000000 00000001---1printf(n %d\n, ~a);return 0;
}打印
n -15.5 例题
例题1
不创建临时变量第三个变量实现两个整数的交换。
方法1
int main() {int a 3;int b 5;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;
}打印
交换前a3 b5
交换后a5 b3上面这个方法有点问题如果ab的和超过了一个整型数据的存储大小那么就计算不了了。 方法2
int main() {int a 3;int b 5;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;
}打印
交换前a3 b5
交换后a5 b3为什么呢
因为异或操作符相同两个数异或为0。
3^30
a^a0
0异或任何数都为数的本身 。
0^33
0^aa
异或是支持交换率的。 例题2
编写代码实现求一个整数存储在内存中的二进制中1的个数。
int count_bit_onr(unsigned int n) {int count 0;while (n) {if ((n % 2) 1) {count;}n n / 2;}return count;
}int main() {int num 0;scanf(%d, num);int ret count_bit_onr(num);printf(%d\n, ret);return 0;
}输入
15打印
4也可以这么写
int count_bit_onr(int n) {int i 0;int count 0;for (i 0; i 32; i) {if ((n 1) 1 1) {count;}}return count;
}int main() {int num 0;scanf(%d, num);int ret count_bit_onr(num);printf(%d\n, ret);return 0;
}输入-1会打印32
这个算法的原理
-1补码11111111 11111111 11111111 11111111
1补码 00000000 00000000 00000000 00000001
-11 00000000 00000000 00000000 00000001不论-1的补码前面多少个1只要和1按位与后就只看最后一位是不是1。
然后运用移位操作符将每一位都和1按位与统计出一共多少个1。 其实还有更加巧妙地算法
nn(n-1)
例如n11
n 1011
n-1 1010
n(n-1) 1010因为nn(n-1)所以现在新的n是1010
n 1010
n-1 1001
n(n-1) 1000因为nn(n-1)所以现在新的n是1000
n 1000
n-1 0111
n(n-1) 0000从这三次变化里面我们可以看到我们执行了一次nn(n-1)那么n最右面那个1就会消失。把所有的1都去掉后就变成0了。 例题3
写一个代码判断n是否为2的次方数。
首先我们先看看2的次方数
000010
000100
001000
010000
100000可以看出2的次方数里面只有1个1。
if (n (n - 1) 0) {printf(yes)
}例题4
编写代码将13二进制序列的第五位修改为1然后改回0。
第5位改成1第5位就和1或|其他位都是0。
第5位改为0第5位就和0与其他位都是1。
int main() {int a 13;//13原码00000000 00000000 00000000 00001101//13补码00000000 00000000 00000000 00001101//16补码00000000 00000000 00000000 00010000//16|1300000000 00000000 00000000 00011101--29int n 5;a a | (1 (n - 1));printf(%d\n, a);a ~(a (n - 1));printf(%d\n, a);return 0;
}打印
29
13