《程序员面试宝典》编程技巧--位运算

高效算法与技巧:深入解析二进制操作与数的表示
本文详细介绍了利用二进制操作进行整数的高效判断与处理技巧,包括判断整数是否为2的N次方、求两个整数的最大值、不使用中间变量交换值、以及理解计算机内部数的二进制表示。通过实例演示了这些算法的核心思想及应用,旨在提升读者在算法设计与实现方面的技能。

1. 判断一个整数是否是2的N次方:

x&x-1

如果X为2的N次方,例如二进制1000,结果就会为0。这个方法非常巧妙,还可以用来判断一个整数中,二进制表示中1的个数,如下:

int count = 0;
输入m;
while(m)
{
     count++;
     m=m&(m-1);
}

每执行一次,会把m中最低位的1清零。所以最终count最终就得到m中1的个数。

2. 不用判断语句求a、b中的最大值:

int max = ((a + b) + abs(a-b)) / 2;
int tmp=a+b;
char * strs[2] = {"a大",“b大”}
tmp = unsigned(tmp) >> (sizeof(int)*8 - 1);
cout <<strs[c]<<endl;

这里利用了负数,最高位符号为1的特性。如果b大于a,tmp就为负数,利用无符号数的右移位(高位补零),留下tmp最高位,即符号位。

3. 不使用中间变量交换a、b的值:

a = a + b;
b = a - b;
a = a - b;

a + b得到的结果可能会越界。下面的方法则不会存在这样的问题。

a = a ^ b;//异或
b = a ^ b;
a = a ^ b;

4.计算机内部数的表示---二进制运算

int b = 0x80000000//为-2147483648

对于0:原码有两种表示方法;
[+0]=0x00000000;

[-0]=0x80000000;

对应的反码也有两种表示。

不过补码只有一种:

[+0]=[-0]=0x0000000;

转载于:https://www.cnblogs.com/XDJjy/p/3894967.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值