位操作的应用:判断一个数是不是2的幂数,实现循环移位【位操作】(55)
- 判断一个数是不是2的幂数
- 实现循环移位
- 图解说明
- 循环左移一位结果说明
- 循环右移三位结果说明
- 移动过程说明
- 循环左移一位过程说明
- 循环右移两位过程说明
- 代码演示
判断一个数是不是2的幂数
怎么证明一个数是2的幂数呢?
在位操作中:
我们发现上面的形式是2的幂数,也就是所有位中只有单个位是1的时候这个数就是2的幂数。
例如:
减去1
哪儿上面的变化有什么特点呢?
那就是如果一个数和一个数减去一按位& 结果为 0。
我们通过代码进行演示:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>typedef enum _BOOL
{FALSE, TRUE
}BOOL;
//判断一个数是不是2的幂数BOOL Is2Idempotent(unsigned num)
{if ((num) & (num - 1))return FALSE;return TRUE;
}int main()
{while (1){printf("cls");unsigned num;printf("pls input num:");scanf("%d", &num);if (Is2Idempotent(num))printf("%d是2的幂数\n",num);elseprintf("%d不是2的幂数!!!\n",num);}return 0;
}
运行结果为:
实现循环移位
图解说明
循环左移一位结果说明
下面体现循环左移动一位的效果:
循环左移动两位的效果:
循环右移三位结果说明
循环右移三位的效果:
移动过程说明
循环左移一位过程说明
初始数据
初始数据左移一位:
初始数据右移七位:
左移和右移结果取|就得到了初始数据的左移一位:
循环右移两位过程说明
初始数据:
初始数据右移两位:
初始数据左移六位:
把移动后的数据按位 |
代码演示
void circleMove(int *data ,int n);当 n>0 的时候左移,n<0 的时候循环右移。
代码演示:
#include <stdio.h>void dis32bin(unsigned data) //打印二进制
{int i = 32;while (i--){if (data & (1 << i))printf("1");else{printf("0");}if (i % 4 == 0){if (i % 8 == 0)printf(" ");elseprintf("-");}}putchar(10);
}void circleMove(unsigned* data, int n)//使用 unsigned 避免有右移补1的问题
{n %= (sizeof(*data) * 8);if(n > 0) *data = (*data << n) | (*data >> ((sizeof(*data) * 8 - n))); //左移逻辑else *data = (*data >> (-n)) | (*data << (sizeof(*data) * 8 - (-n))); //右移逻辑
}int main()
{unsigned a = 0x80000001;dis32bin(a);circleMove(&a, 1);printf("左移1位:\n");dis32bin(a);printf("左移2位:\n");circleMove(&a, 2);dis32bin(a);printf("\n=======================================\n\n");a = 0x80000001;dis32bin(a);printf("右移1位:\n");circleMove(&a, -1);dis32bin(a);printf("右移2位:\n");circleMove(&a, -2);dis32bin(a);return 0;
}
运行结果为:
注意体会循环移位的好处:
循环移位不会导致数据丢失,那么我们就可以通过循环移位实现对于数据的加密。
位操作的应用:判断一个数是不是2的幂数,实现循环移位【位操作】(55)相关推荐
- 判断一个数为多少位 比如 3 是 1位 102 是3位。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //判断一个数为多少位 比如 3 是 1位 102 是3位. #include <iostream> us ...
- python判断一个数是整数、浮点数还是字符串
python判断一个数是整数.浮点数还是字符串 示例代码:
- C语言判断一个数是否是回文数
C语言判断一个数是否是回文数 #include <stdio.h> int main(){int num, s, y = 0;printf("请输入一个数字: ");s ...
- c语言判断2 1000素数,2是不是素数(C语言判断一个数为素数)
我听说西方不承认2是质数,而中国承认 到底是不是真的 2是质数.质数又称素数.一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数:否则称为合数.2是一个大于1的自然数,这一点满足质数 ...
- 腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
1.腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中? 思想:用数组来存这40亿个数,而且只能用bit来表示.why? ...
- 判断一个数是否是2的倍数----------面试算法
思考: 如果要判断一个数是2的倍数,只需要判断这个数的二进制的第一位是1,其他的位都是0就可以. 也就是形如: 100 10000 1000000 注意,上面都是二进制的表示 关键是怎么判断只有第一位 ...
- 判断一个数是不是2的指数幂
判断一个数是不是2的指数幂 求一个数是不是2的指数幂 2^0=1,2^1=2,2^2=4,2^3=8 1 1的二进制为1 2的二进制为10 4的二进制为100 8的二进制为1000 发现只有最高位为1 ...
- 怎样知道一个数是不是2的N次方,怎样判断一个数是奇数还是偶数
1.怎样知道一个数是不是2的N次方 解: X<<1 看是否为0 将该数转换为二进制并且向左移一位,如果是0则是2的N次方 如 2=10 4=100 8=1000 16=10000 ... ...
- python判断哪个数最小_怎么用python比较三个数大小
大部分初学编程的人来说刚开始都会练习判断两个数或者三个数的大小,来熟悉某种语言的特性和最基本的if,else循环,当我们学习了更高级的语法知识后,又会有不同的实现方式,比如依次接收用户输入的3个数,排 ...
最新文章
- 线程与线程池,实例比较。
- lnmp的搭建及php加速
- Java经典面试题整理及答案详解(二)
- 【CSS3】---only-child选择器+only-of-type选择器
- 彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
- ado、odbc连接Postgre SQL
- JAVA框架常用端口
- matlab中uigetfile命令的应用
- 北京3月去哪玩 赏花踏青登山六大推荐
- Java基础入门及安装准备
- 我的世界服务器mcyc.win怎么验证,RTX 2060 光线追踪效果逆天,让《我的世界》变仙境!华硕天选游戏笔记本体验教程...
- Angular最新教程-第七节HTTP get post 设置头部 跨域访问
- python求高阶导数_高阶导数 - 问答 - Python中文网
- php 开发常用英语单词
- WinSock网络编程基础(2)客户端
- 211大学副教授月工资只有7000多?高校教授真实的待遇情况如何?
- 58同城南京品牌公馆数据爬取
- 用python生成纯色图像
- SpEL之#和$的区别
- 【NOIP模拟赛】【乱搞AC】【贪心】【模拟】匹配