1.2
<<左移
>>右移(用符号位填充)
<<<咩有
>>>用0填充高位
1<<35和1<<3是相同的
x&1=1是奇数;0是偶数
获取二进制位是1还是0:这个二进制数&0001000(1表示该位)再反向移动到最低位看是1还是0
#include <stdio.h> int main(){ int a = 5&7; // 101 111 printf("%d\n", a); // 5:101 a = 5|7; printf("%d\n", a); // 7:111 a = ~8; printf("%d\n", a); // -9 a = 5&&7; printf("%d\n", a); // 1 a = 5||7; printf("%d\n", a); // 1 a = !8; printf("%d\n", a); // 0 a = 5^7; printf("%d\n", a); // 2:010 a = 1<<2; printf("%d\n", a); // 4 a = -8>>2; // 1000 1000 printf("%d\n", a); // -2:1000 0010 return 0; }
8的二进制如下: 0000100
取反后: 11111011 这是一个负数的补码形式,但这是哪个负数的补码呢?
我们先看看负数的补码如何表示的。【负数的补码是对其原码逐位取反,但符号位除外;然后整个数加1。】
我们返回去弄:
先把11111011-1=11111010
然后符号位以外取反:10000101
看看除符号外的数:0000101 是9 所以这个数是-9
交换两个整数变量的值:3次异或运算 101,111 -》010-》101^010=111,111^010=101
不用判断语句,求正熟的绝对值
1-1000放在1001个数组中,有一个重复,求该数
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ srand(time(NULL)); int i = 0; int num = 5; int arr[num+1]; int tarr[num]; int res = 0; int rnum = rand()%(num-1)+1; // 需要 0<=x<=10的随机数时,就写成 rand()%11,0–100就写成 rand()%101 printf("%d\n", rnum); // 0<=x<=num-1,1<=x<=num for(i=0; i<num; i++){ arr[i] = i+1; tarr[i] = i+1; } arr[i] = rnum; for(i=0; i<num; i++){ printf("%d ", tarr[i]); } printf("\n"); for(i=0; i<num+1; i++){ printf("%d ", arr[i]); } printf("\n"); for(i=0; i<num; i++){ res = res^tarr[i]; } for(i=0; i<num+1; i++){ res = res^arr[i]; } printf("%d\n", res); return 0; }
4
1 2 3 4 5
1 2 3 4 5 4
4
#include <stdio.h> int main(){int a = 5&7; // 101 111printf("%d\n", a); // 5:101a = 5|7;printf("%d\n", a); // 7:111a = ~8;printf("%d\n", a); // -9a = 5&&7;printf("%d\n", a); // 1a = 5||7;printf("%d\n", a); // 1a = !8;printf("%d\n", a); // 0a = 5^7;printf("%d\n", a); // 2:010a = 1<<2;printf("%d\n", a); // 4a = -8>>2; // 1000 1000printf("%d\n", a); // -2:1000 0010return 0;}