指针,比特位操作

来源:互联网 发布:mac如何修改磁盘名称 编辑:程序博客网 时间:2024/04/29 02:54

为了找工作,最近在看《程序员面试宝典》第四版,发现之前学习C++都是太肤浅了。原来比特位操作还可以很灵活的运用哈...


1.用一个表达式判断一个数X是不是2的N次方(N为整数),不可用循环语句。

!(X&(X-1))


2.不使用任何中间变量,交换a和b的值。

a = a^b;

b = a^b;

a = a^b;


3.指针和基于比特位运算的小算法


#include <stdio.h>#include <cmath>int f(int x, int y){return (x&y) + ((x^y)>>1);//实质功能:求取两个整数的均值}int Add(int x, int y){if (y == 0){return x;}int sum, carry;sum = x^y;             //第一步没有进位的加法运算carry = (x&y)<<1;      //第二步进位并且左移运算return Add(sum,carry);}inline int Max(int x, int y){return ((x+y) + abs(x-y))/2;//选择两个整数中最大数,新思路}inline int max(int a, int b) {return a>=b? a:b;}inline int min(int a, int b) {return a<=b? a:b;}inline int medium(int a, int b, int c){int t1 = max(a,b);int t2 = max(b,c);int t3 = max(a,c);return min(t1,min(t2,t3));}int main(){unsigned int a = 0xFFFFFF7;unsigned char i = (unsigned char)a;char* b = (char*)&a;/** 等价于:* unsigned int *p = &a;* char* b = (char*)p;*/printf("No.1 Pointer problem:\n");printf("%08x, %08x \n", i, *b);printf("No.2 MeanAdd problem:\n");int meanX = f(729,271);int addX = Add(2,8);printf("%d, %d\n", meanX, addX);printf("No.3 Max problem:\n");int maxv = Max(3,5);printf("%d\n",maxv);printf("No.4 Median problem:\n");int medianv = medium(3,7,9);printf("%d\n",medianv);return 0;}


0 0
原创粉丝点击