- #include
- int main()
- {
- int num = 10;
- int n = num<<1;
- printf("n= %d\n", n);
- printf("num= %d\n", num);
- return 0; }
10的二进制表示:0000000000000000000000000001010
记住,数字在计算机中存储的时候都是补码,由于10为正整数,故补码为其本身:0000000000000000000000000001010
左移后为:0000000000000000000000000010100
- #include
- int main()
- {
- int num = 10;
- int n = num>>1;
- printf("n= %d\n", n);
- printf("num= %d\n", num);
- return 0; }
- int num = 10;
- num>>-1;//error
位操作符有:
- & //按位与
- | //按位或
- ^ //按位异或
- ~ //按位取反
直接上代码:
- #include <stdio.h>
- int main()
- {
- int num1 = -3;
- int num2 = 5;
- printf("%d\n", num1 & num2);
- printf("%d\n", num1 | num2);
- printf("%d\n", num1 ^ num2);
- printf("%d\n", ~0);
- return 0; }
将原码转化为补码后,将两个补码对比看,如果均为1则为1,一个为0一个为1或均为0则该位为0。
将原码转化为补码后,将两个补码对比看,如果均为0则为0,一个为0一个为1或均为0则该位为1。
补:xdx提示,这里可以用判断真假的并与或来记住。
将原码转化为补码后,将两个补码对比看,如果该位不同则该位为1,如果该位相同则为0。
这里不管符号位还是数字位统统取反。
补充:这里的运算之后一定要注意都还是补码,一定要把它们换为原码哦!!!!!
不能创建临时变量(第三个变量),实现两个数的交换。
- #include <stdio.h>
- int main()
- {
- int a = 10;
- int b = 20;
- a = a^b;
- b = a^b;
- a = a^b;
- printf("a = %d b = %d\n", a, b);
- return 0; }
编写代码实现:求⼀个整数存储在内存中的⼆进制中1的个数。
- 参考代码:
- //⽅法1
- #include <stdio.h>
- int main()
- {
- int num = 10;
- int count= 0;//计数
- while(num)
- {
- if(num%2 == 1)
- count++;
- num = num/2;
- }
- printf("⼆进制中1的个数 = %d\n", count);
- return 0; }
- //思考这样的实现⽅式有没有问题?
- //⽅法2: #include <stdio.h>
- int main()
- {
- int num = -1;
- int i = 0;
- int count = 0;//计数
- for(i=0; i<32; i++)
- {
- if( num & (1 << i) )
- count++;
- }
- printf("⼆进制中1的个数 = %d\n",count);
- return 0; }
- //思考还能不能更加优化,这⾥必须循环32次的。
- //⽅法3: #include <stdio.h>
- int main()
- {
- int num = -1;
- int i = 0;
- int count = 0;//计数
- while(num)
- {
- count++;
- num = num&(num-1);
- }
- printf("⼆进制中1的个数 = %d\n",count);
- return 0;
- }
- //这种⽅式是不是很好?达到了优化的效果,但是难以想到。
- #include <stdio.h>
- int main()
- {
- int a = 13;
- a = a | (1<<4);
- printf("a = %d\n", a);
- a = a & ~(1<<4);
- printf("a = %d\n", a);
- return 0; }