C:位运算
版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。 |
1.负数表示-二类补数(twos complement) 一般使用二类补数表示负数,最左边一位为符号位. 将一个十进制负数转化为二进制符号数时,首先给这个数加1,然后取绝对值,再将其转换为二进制,最后对这个二进制求补. [1]-5 [2]-4 [3]4 [4]0000 0100 [5]1111 1011 将一个负数从二进制转换为十进制,首先对其所有位求补,然后将结果转换为十进制,再改变其符号,最后再减1. [1]1111 1011 [2]0000 0100 [3]4 [4]-4 [5]-5 使用二类补数表示数字时,用n位可存储的最大正数是2n-1-1,用n位可存储的最小负数-2n-1. 假设整数占32位(4字节),此时可存储的最大正数231-1,最小负数-231,而如果是无符号整数,即unsigned int,其表示范围为0至232-1. 2.按位与和按位或 按位与经常用于屏蔽一个数中的某些位, word&=0x1//除最右边4位外,其余位清零 按位或经常用于将某些位设定为1 word|=0x1//将最右边4位设定为1 3.异或运算 异或运算可以交换两个值而不需要使用临时变量. /*exchange two integer values*/ void swap(int *a,int *b) { *a^=*b; *b^=*a; *a^=*b; } 这里假设机器的整型数长度为32位,对整数0的31位取反,得到最大整数. int main() { int a=0; printf("%i,%i",a,a^0x7fffffff); return 0; } 4.几个经典的位运算函数 4.1求当前机器无符号整型最大长度 /*the max length of unsigned int*/ int int_size () { unsigned int bits; int size = 0; bits = ~0; while ( bits ) { ++size; bits >>= 1; } return size; } 4.2移位运算 /*a bit mover for unsigned int if n > 0 move left for n bits,else move right*/ unsigned int bit_shift (unsigned int value,int n) { int intsize=int_size(); /*the length of unsigned int*/ if(n>0 && n< intsize) /*move left*/ value<<=n; else if (n<0 && n> -intsize) /*move right*/ value>>=-n; else value=0; return value; } 4.3循环移位运算 /*a bit rotate mover for unsigned int if n > 0 move left for n bits,else move right*/ unsigned int bit_rotate (unsigned int value, int n) { unsigned int result,bits,intsize; intsize=int_size(); /*the length of unsigned int*/ if(n > 0) n=n % intsize; else n=-(-n % intsize); if(n==0) result=value; else if(n >0 ){ /*move left*/ bits=value >> (intsize-n);/*bits should be in the rightest*/ result=value << n|bits; }else{ /*move right*/ n=-n; bits=value << (intsize-n);/*bits should be in the leftest*/ result=value >> n|bits; } return result; } 4.4返回无符号整型数value中从右起第p位的值 /* get bit No.p(from right) of value to see if it is on */ int bit_get (unsigned int value, int n) { int intsize=int_size(); /*the length of unsigned int*/ if ( p < 0 || p > intsize-1 )/*out of range*/ return 0; if ( (value >> p) & 1 ) return 1; else return 0; } 4.5将无符号整型数value中从右起的第p位置1 /* set bit No.p(from right) of value on */ unsigned int bit_set (unsigned int value, int p) { int intsize=int_size(); /*the length of unsigned int*/ if ( p < 0 || p > intsize-1 )/*out of range*/ return 0; return value | (1 << p); } 4.6返回无符号整型数value中从第p位(右起)向右n位的值 [1]~(~0 << n)表示最右边n位全为1; [2]value >> (p+1-n)表示将目标位字段移至最右端; /*get n bits of value at position p(from right) */ unsigned bits_get (unsigned int value, int p, int n) { int intsize=int_size(); /*the length of unsigned int*/ if ( n < 0 || p < 0 || p + n > intsize ) return 0; return(value >> (p+1-n)) & ~(~0 << n); } 4.7将无符号整型数value中从第p位(右起)向右n位设置为y最右边n位的值 [1]~(~0 << n)表示最右边n位全为1; [2](~(~0 << n) << (p+1-n)表示将这n个1位左移至位置p; [3]~(~(~0 << n) << (p+1-n))表示将从位置p开始的n位设置零,其余位设置一; [4]unsigned tar=bits_get(y,n-1,n);取出y的低n位; /*set n bits of value at position p(from right) with bits of y*/ unsigned bits_set (unsigned value, int p, int n, unsigned int y) { int intsize=int_size(); /*the length of unsigned int*/ if ( n < 0 || p < 0 || p + n > intsize ) return 0; unsigned tar=bits_get(y,n-1,n); return (value & ~(~(~0 << n) << (p+1-n))) | tar; } 本文出自 “子 孑” 博客,转载请与作者联系! 本文出自 51CTO.COM技术博客 |



zhangjunhd
博客统计信息
热门文章
最新评论
友情链接

