位操作实例解析及数学之美初见

今天我所认识到的数学之美

通过操作符及位运算的掌握,再结合了部分的习题练习。我对是或不是这两个概念的印象越发深刻。正如计算机的二进制一样。是就是1,不是就是0。它不存在其他的结果,它(基本 )不会有模棱两可的第三种中立性判断(不耍心眼,不闹脾气,是或不是直接表现出来 !)。

我们可以结合学习过的运算符,如认为的改变这个结果,就比如& | ^ ~等,来对一个数据内部的bit位进行小小的改变,进而影响这个数据的真实值。也可以用&& || !来对多种结果进行综合考虑进而影响大局。

因为大一所学的《离散数学》这么课程,我个人也就对这种简单的逻辑运算比较熟悉,但是经过练习后发现,很多复杂的文字类型的逻辑题,在我们能够正确的将解题关键条件用c语言翻译出来后,结合一定的分支或选择语句,就可以利用计算机解出一道比较复杂的逻辑题。而且,计算机比我们人动脑算的要快,在翻译条件完全正确的前提下计算结果甚至不会出现错误!

都说计算机是以模拟人的行为(思考)来实现问题的解决的。单纯的从这一小点上来看,这几个小小的逻辑运算符既已经大致(用词不准确,请见谅)如何模仿人脑对事物的思考判断。
如果我们将待解决的问题的规模放大,再放大。人脑就会很难对问题进行高效的解决(就算可以,相比计算机来说,在大致解决思路正确的前提下,计算机要快要准)。但是,计算机的配置是可以扩容的,我们可以随着问题规模的扩大而使计算机的配置扩大,由程序员来确定大致的解决方法,将无趣烦杂的解题过程交给计算机来解决,从而提高效率。

在这个过程中,程序员将解决办法交给计算机时,就需要使用一种工具——计算机语言。

而计算机语言,需要能够在一定程度上承载住解决问题的具体实现。
然而大多数实现过程中都或多或少会使用到数学,并且数学在计算机解决问题的过程中不可缺少的。
(当然你不可能让计算机去写高考作文或者阅读理解)
所以个人理解,

  • 解决问题的工具是计算机语言!
  • 计算机语言是使用者逻辑或算法的载体
  • 多种算法或逻辑集合使用再借助计算机高效准确的运算属性最终实现问题的解决

按位运算

- 打开位(设置位 )(特定位置1)

任何数与1取或运算的结果都是1
逻辑上的运算和按位运算在本质上是相同的
所以如果需要给某个数的特定位置1.就需要在这一个bit位上对该数按位运算|1。

xxxxxx0xxxxx | xxxxxxx1xxxxx —>xxxxxxx1xxxxx

但是如何准确地对某一个位进行该操作呢,这里就需要运用到位移操作符。
规律发现

如果需要对某数y的二进制码中的第x个bit位进行置1操作。

y = y | (1<<x)

(位移运算左移无脑补0)

3关闭位(清空位)(特定位置0)

任何数与0取逻辑与运算的结果都是0

任何数与1取逻辑与运算的结果都是这个数本身

如果想给某个数的某一个bit位上置0,我们可以对这个比特位与0进行按位取与。
但是如何精确到这个bit位上,但是又不影响其他位上的数据呢?

结合上述性质。我们发现,我们如果需要给某位置0,需要对其余各个bit位上进行按位与1取与运算,对目标位进行按位 与0取与运算。只有这样才能保证数据最终符合要求。
但是如何确定这个数呢?
题目只给了对第x位进行置零操作,(跟着感觉走)我们发现,先1左移x位在对这个数进行按位取反操作,就得到了符合要求的工具操作数(这个数感觉就是个开关类的工具)

如果需要对某数y的二进制码中的第x个bit位进行置0操作。

y = y & (~(1<<x))

2切换位(特定位取反).

0与1取逻辑异或运算的结果都是1

1与1取逻辑异或运算的结果都是0

计算机中只有0和1两种数

由此可见,再计算机中,如果要实现某一个位进行状态切换,只需要对这个位上的数和1进行按位异或就可以实现状态的改变。
同理结合左移操作

如果需要对某数y的二进制码中的第x个bit位进行切换状态的操作。

y = y ^ (1<<x)

1 检查位(检查某个位或某个数的0或1的个数)

在c语言的学习中。我们肯定遇到过一道这样的练习题。

请确定一个数x的二进制中有几个1?

膜2,除2,循环判定,一气呵成!别问我为什么,就是一个字,帅!

这个方法有错吗,没错,一点错都没有。它是利用膜2 除2外加循环,来计算出二进制的每一位上相对应的数字。
但是!!!!计算机中的所有数都是二进制形式的,我们为什么不直接去二进制中一个一个找呢?算多麻烦!(计算机中所有数据都是以补码形式储存的,有利于cpu的运算以及避免大小1问题)(c会自动将数据转换成补码)(以上说法可能不准确,但是计算机中绝对不是存放数据的二进制数)
既然二进制有了,我们就可以直接再二进制中按位一个一个的找。(循环判断变量++这个我拿手,但这个不是最优的!)
优化算法!

while (x)
	{
		x = x&(x - 1);
		cont++;

	}

二进制位上有几个1就做几次循环
x = x&(x - 1);算法优化的关键
例如
(0000 1000)x = x ( 0000 1010 ) & (x-1) (0000 1001) cont++ while条件成立
(0000 0000)x=x(0000 1000) &(x-1) (0000 0100) cont++ while条件不成立

总结

无脑ruaruarua!
某位置1,无脑对y = y & (1<<x)
某位清,无脑 y = y & (~(1<<x))
某位切换,无脑y = y ^ (1<<x)
判1判0,核心x = x&(x - 1)

离散数学的温故知新(雾)

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

你看着不直白的说话方式,你看着又有点傲娇的成立条件,这要是放在离散数学的期末考试卷子上,我妥妥的估计要挂科。
不是我不会,是因为我懒!
我会用枚举的方法一个一个的试,直到最后满足条件。
但是那样的话,要试好多次,且每次得出来的结果都要记录卡下来。这谁记得住啊。
而且,考试毕竟是考试,没有过程光有答案估计也不会给我分,所以我就懒得写了

但是现在挺好,我有计算机了,这东西比脑子好使多了。穷举就交给他了,记录也交给他了,只要过程合理,结果正确,我就算是完成任务了。
所以,我只用使用语言,将成立条件翻译出来就行了!
(代码我就不上了!)(c语言没有逻辑异或!)
由此可见,只要对比较复杂的数学问题,(利用数学)确立一个合理的解决思路,最后解决的过程及运算,都交给计算机这个机器去完成。
由此可见,数学是编程中不可忽视的。

(唠唠叨叨,屁话贼多,你到底想说个啥)

我今年大二,去年高数挂了,离散中等,现代及格线边边上。我是学计算机的,我现在有点后悔了。

如果有学弟学妹看到这篇博客,我希望你们可以看到这句话。

好好学数学!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值