首页 > 编程知识 正文

护理理论四个基本概念,算法的基本概念

时间:2023-05-04 08:35:01 阅读:152715 作者:2087

C语言有六个位运算符。

按位

|按位或

^按位异或

取反

向左移动的话,相当于*2

向右移动,正的高位补充0,负的位由计算机决定

循环k次(xk )|(x ) 32-k ) ),

循环k次(xk )|(x ) 32-k ) )

当然在优先顺序的问题上犯错误的情况很多~~~

优先顺序和口诀如下

优先级运算符记忆战术1 () [] . -括号成员第一; //括号运算符[] (成员运算符. -

整体单眼第二; //所有单眼运算符例如为---、- (负)、指针运算*、乘除馀数三、加减四//所谓该"馀"为馀数运算,取%

班次五、关系六; //移位运算符:关系:==等

不相等列第七); //即==和!=

位和异或位或; //它们中的一些是位运算:位和(的异或) ^ (位或(|) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) 652

“三分天下”八九十;

或逻辑和; //逻辑运算符:||和

十二和十一; //注意顺序:优先级(|)为优先级) )以下

条件高于赋值,//三目运算符的优先顺序为13比特只比赋值运算符和','高

逗号运算水平最低! //逗号运算符的优先级最低

2! ~ ((负) ) ) ) ) )。

- ()获取变量地址(*

(type ) )强制类型) sizeof

3*/%4 -5 6==7==!=89^10|1112||13?14==-=*=/=|=^==15,

位、运算位和运算符“”是双目运算符。 其功能是分别与参与运算的2个数相对应的二进制相和二进制相。 只有当相应的二进制数都为1时,结果位才为1,否则为0。 参与运算的数表现为补数。

例如,95表达式可能如下:

00001001(9的二进制补码) )。

00000101(5的二进制补码) )。

00000001(1的二进制补码) ) )。

可以看出95=1。

按位和运算通常用于将某些位清零或保持某些位。 例如,如果将a的前八位清除为0,保留后八位,则可以进行a255运算。 255的二进制数是0000000011111111。

位或运算位或运算符“|”是双目运算符。 其功能是分别对应于参与运算的两个数的二进制相或。 如果对应的两个二进制文件中的任何一个为1,则结果位为1。 参与运算的两个数都以补数出现。

例如,9|5可以编写以下表达式:

00001001

|00000101

00001101 (十进制为13 ) ) )。

知道9|5=13

异或运算异或运算符“^”是双目运算符。 其功能是,如果参与运算的两个数各自对应的二进制不同,或者两个对应的二进制不同,则结果为1。 参与运算数据仍然表现为补数,例如9^5可以写成如下公式:

00001001

^00000101

00001100 (十进制为12 ) ) )。

求逆运算求逆算子~是单眼算子,具有右结合性。 其功能是将参与运算的数的各二进制按比特反转。 例如,~9的运算如下所示。

~(0000000000001001 ) () ) ) )。

结果是11111111111111110110

左移运算左移运算符“”是双目运算符。 其功能是将“”左操作数的各二进制文件全部左移若干位,指定“”右数要移位的位数,舍弃高位,低位补0。 例如:

a4

指将a的每个二进制文件左移四位。 如a=0000011 (十进制3 )所示,向左移动4位即为00110000 (十进制48 )。

右移运算右移运算子「」是双目运算子。 其功能是将“”左侧操作数的各二进制文件全部向右移位几个,然后单击

gt;”右边的数指定移动的位数。例如:
    设  a=15,
    a>>2
表示把000001111右移为00000011(十进制3)。

注意:对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,

         最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。

 

简单运用

一:交换两个数(字符),不用第三个变量就可以交换两个变量的值了:

      用异或^,原理:两次异或能还原,即a = (a^b) ^ b

 

二:判断一个数是不是2的幂次:

     原理:2的幂次的二进制表示中只有一位是1,其他位为0

     x = x&(x-1)是让x的二进制码最右侧的1置为0,如果结果为0就表示原先x只有1位是1,其他位为0

     inline bool is2pow(int x) { return (x&(x-1)==0 && (x!=0)); }

     inline bool is2pow(int x) { return ( (x&-x)==x ); }

 

三:求一个整数有多少位是0:

      原理同上。用x&(x-1)

1 int count = 0;2 while(x)3 {4 ++count;5 x &= (x-1);6 }

 

四:二进制快速求幂:

1 long pow(int x, unsigned int n){2 long p = 1;3 while (n){4 if (n & 1) p *= x;5 x *= x;6 n >>= 1;7 }8 return p;9 }

 

五:判断奇偶数:

     原理:奇数最后一位为1,偶数为0

     inline bool odd(int x) { return x&1; }

     inline bool even(int x) {return !(x&1); } 

     n%2 = n&1

     n%4 = n&3

     n%8 = n&7

     ……

 

六:求x绝对值:

     原理:x为正数时不做改变,为负数时取反加1

     x为正数时y = 0 = 0000 0000 0000 0000

     x为负数时y = -1 = 1111 1111 1111 1111

     跟0异或是本身,跟1异或是取反

1 inline int abs(int x){2 int y = x >> 31;3 return ( x^y-y);4 }

 

七:对2的幂次取模:

     原理:x&y取出x和y二进制位1的所有位。x^y>>1取出x,y只有一个二进制位1的并除以2

     return (x&y) + (x^y)>>1);

     不用位运算时注意 (x+y)/2,有可能会溢出。

     x向上取整到y,其中y=2^n (字节对齐用):

     #define rund(x,y) ( ((x)+(y)-1)&~((y)-1) )

 

八:其他:

    只有第k位为1的数 1 << (k-1)

    后k位为均为1的数 (1<<k)-1

    x 的第k+1位 x >> k &1

    x的第k+1位置1: x >> k |(1 << k)

    x的第k+1位置0: x >> k &~(1 << k) 

    注意:左移1位再右移1位不一定时原先的值

 

至于高深用法可以戳戳这里 :http://www.cnblogs.com/tdyizhen1314/archive/2012/04/03/2431122.html

转载于:https://www.cnblogs.com/zyxStar/p/4564335.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。