使用移位操作符实现无符号整数位反转
2015-07-29 16:33
429 查看
>>
左移
各二进位全部左移若干位,高位丢弃,低位补0
>>
右移
各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)。
左移右移符号结合性L-R
1与0异或得1,1与1异或得0,所以与1异或的结果与原来的位相反。
0与0异或得0,0与1异或得1,所以与0异或的结果与原来的位相同。
1与0相与得0,1与1相与的1,所以与1相与的结果与原来的位相同。
0与0相与得0,0与1相与得0,所以与0相与的结果为0。
1与0相或得0,1与1相或得1,所以与1相或的结果为1。
0与0相或得0,0与1相或得1,所以与0相或的结果与原来的位相同。
计算整数中1的个数:
左移
各二进位全部左移若干位,高位丢弃,低位补0
>>
右移
各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)。
左移右移符号结合性L-R
#include <stdio.h> template <class T> void PrintfBinary(T a) { int i; for (i = sizeof(a) * 8 - 1; i >= 0; --i) { if ((a >> i) & 1) putchar('1'); else putchar('0'); if (i%8==0) putchar(' '); } putchar('\n'); } int main() { int ll=0x800000ff; printf("算数右移1位:\n"); PrintfBinary(ll); ll>>=1; printf("算数右移后\n"); PrintfBinary(ll); }
1与0异或得1,1与1异或得0,所以与1异或的结果与原来的位相反。
0与0异或得0,0与1异或得1,所以与0异或的结果与原来的位相同。
1与0相与得0,1与1相与的1,所以与1相与的结果与原来的位相同。
0与0相与得0,0与1相与得0,所以与0相与的结果为0。
1与0相或得0,1与1相或得1,所以与1相或的结果为1。
0与0相或得0,0与1相或得1,所以与0相或的结果与原来的位相同。
<pre name="code" class="html">#include <stdio.h> template <class T> void PrintfBinary(T a) { int i; for (i = sizeof(a) * 8 - 1; i >= 0; --i) { if ((a >> i) & 1) putchar('1'); else putchar('0'); if (i == 8) putchar(' '); } putchar('\n'); } template<typename T> T Reverse(T a) { int len=sizeof(T)*8; int i,j; i=0; j=len-1; int tem1,tem2; while(i<j) { tem1=(a>>(i%len))&1; tem2=(a>>(j%len))&1; if(tem1!=tem2) { a^=1<<(i%len); a^=1<<(j%len); } i++; j--; } return a; } int main() { printf("二进制逆序\n\n"); printf("逆序前: "); unsigned short a = 12345; PrintfBinary(a); printf("逆序后: "); unsigned short result=Reverse(a); PrintfBinary(result); }
计算整数中1的个数:
#include <stdio.h> template <typename T> void PrintfBinary(T a) { int i; for (i = sizeof(a) * 8 - 1; i >= 0; --i) { if ((a >> i) & 1) putchar('1'); else putchar('0'); if (i % 8==0) putchar(' '); } putchar('\n'); } template<typename T> int comnumof1(T a) { int len=sizeof(T)*8; int count=0; for(int i=0;i<len;i++) { if(( (a>>i)&1)==1) count++; } return count; } int main() { printf("二进制中1的个数\n\n"); unsigned short a = 34520; printf("原数 %6d的二进制为: ", a); PrintfBinary(a); printf("原数 %6d中1的个数为%d \n",a,comnumof1(a)); return 0; }
相关文章推荐
- ORACLE 毫秒变换为日期 日期转换毫秒
- 关键词抽取简介
- LeetCode_230 Kth Smallest Element in a BST
- Java final关键字
- snnu1120: 划分数(DP计数问题)
- POJ 1201 Intervals 差分约束
- [LeetCode] Set Matrix Zeroes
- c++ bitset类用法
- Java基础——内部类
- 线段树入门
- 浅谈语言
- PHP检测当前字符编码并转码
- 线段树入门
- HDU1542 线扫描求矩形面积并
- hdu 5417 RGCDQ 2015多校联合训练赛
- hdu 5316 Magician(2015多校第三场第1题)线段树单点更新+区间合并
- 实习总结
- ThinkPHP实现递归无级分类――代码少
- 基于json-lib.jar包 创建JSONArray的四个常用方法
- Android Studio 配置