位运算符

运算符 作用 示例
& 按位与 两个操作数同时为1结果为1
| 按位或 两个操作数只要有一个为1,结果就为1
~ 按位非 操作数为1,结果为0;操作数为0,结果为1
^ 按位异或 两个操作数相同,结果为0;不相同结果为1
<< 左移 右侧空位补0
>> 右移 左侧空位补符号位 (右移,正数,除2,负数,减一除2。 无符号数也是正数)
  • 凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据的基本单位是字节(Byte)

  • 一个字节由8个位(bit)所组成。位是用以描述电脑数据量的最小单位

  • 如果开辟1G的空间大小,使用malloc(1<<30)

    • 1M malloc(1<<20)
    • 1K malloc(1<<10)
  • 左移:为最高位丢弃,低位补0,相当于乘2

  • 右移:为最低位丢弃,高位补0,相当于除2

  • 负数: 右移对于偶数来说,是除2,但是对于奇数来说,先减一,在除2

    • 例如: -8>>1 得到-4 -7>>1 得到是-4,并不是-3 -1无论右移多少位,值永远都是-1
  • 任何正数按位取反,就是这个数的负数减一

    • 例: int i = 5; ~i; // -6
  • 不用循环的到任何一个数,最低位为1的那个数?

    • 把它和它的负数按位&一下就得到了
  • 异或(相同的数,异或为0,任何数和0异或就为本身)

    5^7 = 2
    0000 0000 0000 0101
    0000 0000 0000 0111
    =
    0000 0000 0000 0010
    i=i^j;
  • 任何数和自身异或。得到0

  • 任何数和0异或,得到自身

int arr[]={2,8,3,4,7,9,0,1};
int n = sizeof(arr)/sizeof(int);
printf("n  = %d\n",n);
for (i = 0; i < n; ++i) {
 printf("%d ",arr[i]);   
}   
printf("\n");
for (k = 0; k < n-1; ++k) {
   for (m = 0; m < n-k-1; ++m) {
       if(arr[m] < arr[m+1])
       {   
           /*  
           int temp = arr[m];
           arr[m] = arr[m+1];
           arr[m+1] = temp;
           */
           arr[m] = arr[m] ^ arr[m+1];
           arr[m+1] = arr[m] ^ arr[m+1];
           arr[m] = arr[m] ^ arr[m+1];
       }   
   }   
}
  • 逗号表达式的值是最后一个变量的值

posted on 2021-07-23 16:39  lodger47  阅读(45)  评论(0)    收藏  举报

导航