深机之位操作点滴

//long long ago,老师让写一个交换整数的函数..
//大家都信手拈来,
void swap_int(int *a,int *b)
{
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}
//然后老师写了一个不用临时存储的,觉得  ‘哇,还有这种操作’
void swap_int(int* a,int *b)
{
    *b = *a + *b;
    *a = *b - *a;
    *b = *b - *a;
}
//然后又在书上看见了这么操作的,...
void swap_int(int* a,int *b)
{
    *b = *a ^ *b;
    *a = *a ^ *b;
    *b = *a ^ *b;
}
//虽然以上两个较第一个并没有性能上的优势,这不过,最后这一种比较前者,是不是更赏心悦目一点。

简单了解:

C语言支持按位布尔操作,‘ | ’或,‘ & ’与,‘~’取反,‘^’异或。

不过这些得与判断命题真假的逻辑运算区分开来,如‘||’或,‘&&’与,‘!’非。

逻辑运算认为所有非0的参数都为TRUE,而按位运算只是在特殊的情况下才出现结果为0或者1,拥有逻辑运算行为。
还有一点,逻辑运算符,如果对第一个参数求值,就能确定表达式的结果,那么就不会对第二个参数求值。如a && 5/a,这不会造成除0操作,以及p&&*p++不会导致间接引用空指针。

// 判断两个整数相等,不使用‘==’
int equal_ints(int x,int y)
{
    return !(x^y);
}
//很好理解,如果两个数相等。异或后便是0,NOT后便是1
//        如果两个数不相等,异或后便是任意不为0的数,NOT后便是0
//此处需理解 '~'和'!'的区别

关于移位:

左移:<< 后补 0
右移:>> 分为两种,1,逻辑右移,前补0;
2,算数右移,前补1
无符号数据必是逻辑右移的,几乎所有的编译器对于有符号数据都是使用算数右移。

移动K位,k很大的情况下,比如在一台32位机上,

    int x = 0x12345678>>32
    int y = 0x21436587>>36
    int z = 0x87654321<<40

C语言中并没有特殊说明该如何转换,不过在很多机器上都有此规则,利用mod运算,因此,在这种机器上,x右移0位,y右移4位,z左移3位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值