整数按位异或运算 C语言
题目:输入一个32位的整数a,使用按位异或^运算,生成一个新的32位整数b,使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果
最高位和最低位默认为1
这个题目当时真的成功地恶心到我了,没精力解释了,自己看代码吧
具体的解释,代码中注释已给出
若有不懂,可以给我留言,我会尽快回复。
/** 输入一个32位的整数a,使用按位异或^运算,* 生成一个新的32位整数b,使得该整数b的每一位* 等于原整数a中该位左右两边两个bit位的异或结果* 这是一个麻烦的问题!!! */
#include <stdio.h>
#include <stdlib.h>
void set_number(int n, int *n_); //输入原数,按题目输出目标数字
void set_target(int *n, int target, int set_); //把相应的target位置为set_(0或1)
void print_number(int n, int r_start, int r_end); //从start到end打印出n的二进制形式
int main()
{int n;int n_;printf("输入一个32位整数,生成一个新的32位整数,使得该整数的每一位等于\n原整数的该位左右两bit位异或的结果\n");printf("生成的新的数最两边默认为1\n");printf("请输入一个数:");scanf("%d", &n);printf("%d\t的二进制位:", n);print_number(n, 0, 31);set_number(n, &n_);printf(" 修改后的二进制位:");print_number(n_, 0, 31);return 0;}
void print_number(int n, int r_start, int r_end)
{int flag = 1;int i;for (i = r_end; i >= r_start; i--){flag = flag << i; //flag移到相应位if (flag & n) //判断相应位是1还是0printf("1"); //若为1打印1,否则打印0elseprintf("0");flag = 1;}printf("\n");
}
void set_number(int n, int *n_)
{int flag1 = 1, flag2 = 1;*n_ = 1;*n_ = (*n_ << 31) + 1;for (int i = 1; i <= 30; i++){flag1 = flag1 << (i - 1); //flag1移位到相应位,测相应位的值,取出n的左右相邻两位的值flag1 = flag1 & n; //测为1或0flag2 = flag2 << (i + 1);flag2 = flag2 & n;flag1 = flag1 ^ (flag2 >> 2); //flag1,flag2异或后的结果存在flag1里面if (flag1 != 0) flag1 = 1; //flag1若不为0,则置1,只需要判断flag1是否为1就行了set_target(n_, i, flag1); //之前范的错误就是flag1传过去的不是1,但是set_只能为0或1flag1 = 1;flag2 = 1;}
}
void set_target(int *n, int target, int set_)
{int flag = 1; //(think about it.) flag = flag << target; //测要修改的位为1还是0if (*n & flag){if (set_ == 1) //若原来这个位为1,设置为1,则set_需要取反set_ = 0;else //若原来这个位为1,设置为0,set_也需要取反set_ = 1;}flag = set_;flag = flag << target; //相应的位修改为set_,准备修改数n的目标位 *n = *n ^ flag;
}
整数按位异或运算 C语言相关推荐
- c语言中按位或与按位异或的区别,C:按位与、按位或、按位异或运算
一.按位与 & 1.概念:参加运算的两个对象,按二进制位进行"与"运算,负数按补码形式参加按位与运算. 2.规则 0&0=0; 0&1=0; 1&0 ...
- c语言 按位异或,C:按位与、按位或、按位异或运算
一.按位与 & 1.概念:参加运算的两个对象,按二进制位进行"与"运算,负数按补码形式参加按位与运算. 2.规则 0&0=0; 0&1=0; 1&0 ...
- c语言任意两个整数相减_大整数加减运算的C语言实现
大整数加减运算的 C 语言实现 一 . 问题提出培训老师给出一个题目:用 C 语言实现一 个大整数计算器.初步要求支持大整数的加.减运算,例如 8888888888888+1112=888888889 ...
- c语言带括号整数四则混合运算,带中括号整数四则混合运算练习题.doc
带中括号整数四则混合运算练习题 精品文档2016全新精品资料-全新公文范文-全程指导写作 –独家原创 PAGE1 / NUMPAGES1 带中括号整数四则混合运算练习题 540÷﹙30×15÷50﹚× ...
- c语言中按位异或运算,^按位异或运算符
^表示按位异或运算符,顾名思义,相异,即不同则为1,反之为0 例如15和16进行异或运算,运算过程如下:15 0000 0000 0000 0000 0000 0000 0000 1111 16 ...
- C语言 按位异或运算
按位异或运算: 规律:无论0或1,异或1取反,异或0不变 变量交换: 题一:给定两个数 a 和 b ,用异或运算交换它们的值. 思路: 1)中间量t = a^b 2) b = tb,相当于abb,根据 ...
- c语言提供了6个位运算,C语言基础丨运算符之位运算符(六)
对于更多紧凑的数据,C 程序能够用独立的位或多个组合在一块儿的位来存储信息.文件访问许可就是一个常见的应用案例.位运算符容许对一个字节或更大的数据单位中独立的位作处理:能够清除.设定,或者倒置任何位或 ...
- c语言怎么将两个整数变量值交换,C语言如何利用异或进行两个值的交换详解
C语言异或运算 位运算符家族中,最常用的,某过于异或运算符. 异或运算符是指: 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1.即:0^0=0, 1^0=1, 0^1=1, 1^1=0 例 ...
- c语言 高字节和高字节运算 低字节和低字节运算,C语言关系运算符和位运算符.ppt...
<C语言关系运算符和位运算符.ppt>由会员分享,可在线阅读,更多相关<C语言关系运算符和位运算符.ppt(42页珍藏版)>请在装配图网上搜索. 1.第3章 关系运算符和位运算 ...
最新文章
- Java多线程:Semaphore
- Autograd:自动求导
- linux——DHCP的配置问题
- C#中对象的序列化与反序列化
- 大数据领域可以应聘的岗位
- E百科 | 第2期 扒一扒能加速互联网的QUIC协议
- 【Java】图解 Spring 循环依赖,写得太好了
- pthread线程传递数据回主线程_操作系统4:线程(1)
- Android FrameWork——PackageManager框架
- 逆天通用水印扩展篇~新增剪贴板系列的功能和手动配置,卸除原基础不常用的功能...
- ENVI5.4中Himawari-8数据处理(向日葵8号卫星H-8)
- PolSARpro导入外部极化矩阵数据(以高分三号为例,附格式转化代码)
- Jconsole小记
- Java 文件上传同时携带参数
- 裁员潮,互联网寒冬的黑暗时刻
- MacOS安装Photoshop2022提示错误代码107(Error Code: 107)(更新)
- 构建新型现代化智慧博物馆之物联网环境监控方案
- Java字节流读取shp_shp系列(四)——利用C++进行Shx文件的读(打开)
- 服务器文件夹temp,服务器性能变慢 c盘temp文件夹存在大量sess开头文件的问题原因及解决...
- java如何jasper_java – 如何以编程方式打印Jasper报告
热门文章
- JAVA程序设计:追逐游戏(LCP 21)
- JS_js判断当前是否是微信浏览器,判断移动端浏览器类型,微信浏览器、支付宝小程序、微信小程序等
- sql 函数执行动态sql_什么是SQL函数?
- java练习之生成随机数1-10,如果是1输出“恭喜,中1等奖”,如果是2输出“恭喜,中2等奖”,如果是3输出“恭喜,中3等奖”,如果是4输出“恭喜,中4等奖”,如果是5输出“恭喜,中5等奖
- 确保移动应用成功的16项指标
- 实现VR直播的关键技术
- 助力中文文字识别突破,美团公开首个真实场景招牌图像数据集 1
- fastapi_No.23_事件_启动和关闭事件
- Android Compose 沉浸式状态栏
- java 8583报文解析_8583报文解析实例