正负数十进制转二进制 位运算 C语言版

2008年11月01日 18:03 . 分类 编程相关 . 2 条评论 . 被踩 417 次 

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

今天在论坛上看到一个负十进制数转二进制的问题,于是小研究了一下,顺便学习位运算。。。

我们知道负数的二进制是由其正数的二进制取反(求反码)再加一(求补码)得到的,例如:

十进制数528的二进制码为:0000001000010000

将其取反(求反码)后的结果:1111110111101111

将反码加一(求补码)后结果:1111110111110000

所以,-528的二进制码为1111110111110000

小说一下概念,然后看一个位运算符,按位与(&) :0&0=0 , 0&1=0 , 1&0=0 , 1&1=1

我们知道,奇数的二进制最后一位全部为1而偶数的二进制最后一位全部为0,那么用按位与运算符我们可以很方便地知道一个数是奇数还是偶数,只要让数字 &1 就可以了,因为 奇数&1=1 ,而 偶数&1=0

现在看一段代码,作用是将十进制数转换为二进制数。

#include <stdio.h>

int main()
{
int x,i;
scanf("%d",&x);
for(i=31;i>=0;i--) printf("%d",x>>i&1);
system("pause");
}

重点就在 x>>i&1 啦,每次按照能否被二整除来确定0或者1,然后一位一位的移动,这样处理负数也是可以的,很爽~详细解释太麻烦,自己思考吧,嘎嘎~

Slyar Home 十月博客总结(2008)

2008年11月01日 0:05 . 分类 网络生活 . 3 条评论 . 被踩 220 次 

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

Slyar Home又长大了一个月,让我们看看Slyar Home十月份的表现吧。

我要阅读全文

你能看出几个旋转方向?

2008年10月31日 11:49 . 分类 网络生活 . 7 条评论 . 被踩 366 次 

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

据说是美国耶鲁大学研究出来的,什么顺时针用右脑,逆时针用左脑。

不过我倒觉得这就是个视错觉问题。我一开始看就是顺时针,然后怎么也看不出逆时针的。。。大约过了3分钟我才看出来逆时针旋转,之后就可以自由控制旋转方向了,眨一下眼,顺时针;再眨一下眼,逆时针。。。

不知道大家看出来几个旋转方向?

PS.此幅旋转图一共有34帧,每帧是0.03秒,小于人的视觉停留时间(0.05-0.2S)。一个周期是1.02秒,前12帧(0.36S)是顺时针旋转特 征明显,后22帧(0.66S)是逆时针旋转的特征明显。但是每一帧都可以理解为顺转或逆转。秘密就在这里,当你第一眼接触到的几帧图片是前12帧时,知 觉的识别性首先判定为顺转,又由于知觉的滞留性,顺转的感觉会一直持续影响知觉对后面一些帧的判定,因此整幅图片看起来都是顺转。反之,当你第一眼接触到的几帧图片是后22帧时,知觉的识别性首先判定为逆转,又由于知觉的滞留性,逆转的感觉会一直持续影响知觉对后面一些帧的判定,因此整幅图片看起来都是逆 转。调整自己的注意力,你还可以控制舞女旋转的方向。

碾转相除法求最大公约数不用比较两数大小

2008年10月30日 19:24 . 分类 编程相关 . 4 条评论 . 被踩 380 次 

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

辗转相除,又名欧几里德算法(Euclidean algorithm),是求两个正整数之最大公因子的算法。它是已知最古老的算法, 其可追溯至前300年。它首次出现于欧几里德的《几何原本》中,而在中国则可以追溯至东汉出现的《九章算术》。

以前学碾转相除的时候也没怎么考虑,看到书上说要先比较两个数的大小再碾转相除我就习惯性地先比较大小了,可是今天发现碾转相除法是不用比较两个数的大小的。。。

设我们有两个数m、n

1、用m除以n,得余数r

2、使m=n ,n=r

3、若r=0,则m就是最大公约数;若r不等于0,返回第1步

我们可以看到,如果m>n,那么没说的;如果m<n,在第一次m除以n后,余数恰好为m,这样一交换,最后还会变成m>n的情况。

C语言实现代码为:

#include <stdio.h>

int main()
{
int m, n, r = 1;
scanf("%d%d", &m, &n);
while (r != 0)
{
r = m % n;
m = n;
n = r;
}
printf("%d", m);
return 0;
}

还有一个利用条件运算符写的求最大公约数程序代码

#include<stdio.h>

int main()
{
int m, n;
scanf("%d%d", &m, &n);
while(m > n ? (m = m % n) : (n = n % m));
printf("%d", m + n);
return 0;
}

八皇后问题 回溯递归 C语言版

2008年10月29日 22:50 . 分类 编程相关 . 5 条评论 . 被踩 218 次 

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

今天听陈星火老师(火爷)的讲座提到了八皇后问题,正好今天没写的,于是晚上上完课回来就写了一段回溯递归解决八皇后问题的代码,当然也可以解决N皇后问题。运行后得到解为92组。

/* Code by Slyar */
#include <stdio.h>
#include <stdlib.h>

#define max 8

int queen[max], sum=0;/* max为棋盘最大坐标 */

void show()/* 输出所有皇后的坐标 */
{
int i;
for(i = 0; i < max; i++)
{
printf("(%d,%d) ", i, queen[i]);
}
printf("\n");
sum++;
}

int check(int n)/* 检查当前列能否放置皇后 */
{
int i;
for(i = 0; i < n; i++)/* 检查横排和对角线上是否可以放置皇后 */
{
if(queen[i] == queen[n] || abs(queen[i] - queen[n]) == (n - i))
{
return 1;
}
}
return 0;
}

void put(int n)/* 回溯尝试皇后位置,n为横坐标 */
{
int i;
for(i = 0; i < max; i++)
{
queen[n] = i;/* 将皇后摆到当前循环到的位置 */
if(!check(n))
{
if(n == max - 1)
{
show();/* 如果全部摆好,则输出所有皇后的坐标 */
}
else
{
put(n + 1);/* 否则继续摆放下一个皇后 */
}
}
}
}

int main()
{
put(0);/* 从横坐标为0开始依次尝试 */
printf("%d", sum);
system("pause");
return 0;
}

突然发现宵夜是会越吃越饿的

2008年10月28日 23:20 . 分类 网络相关 . 11 条评论 . 被踩 224 次 

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

今天课多,事情也多。刚才上完选修课陪同学去吃宵夜,既然是"陪",我就没打算多吃,而且我本来也就不是很习惯吃宵夜,所以我就买了一笼蒸饺,结果这不吃没事,一吃可就不得了了......吃完那笼蒸饺我惊愕地发现我居然饿了......既然饿了,那就再吃吧,于是我就又买了一笼蒸饺,我心说这下吃完不会饿了,结果......我又吃了一碗炒河粉才解决问题......

结论:宵夜不能随便吃,因为宵夜是会越吃越饿的......

今天事情超级多,多到我都一天没时间开电脑。下午骑车去上课的时候来了一个急刹车,结果车是刹住了,不过车闸也英勇就义了......没辙,叫上Jet跟我去北理工那边换车闸,叫Jet是去是因为那车行老板是潮汕人,咱没法交流......

明天要上台讲高数,题咱还没做;下星期考英语,单词咱还没背;形式与政策的课,咱还没去听;饭卡快没钱了,咱还没去充值......

结论:所有的事情堆在一起是会忙死人的......

关闭
E-mail It