二进制右对齐取反_四方语(4Case)与二进制数字

二进制信号是天然的,光的明暗、电路的通断、量子的左右旋……皆为自然语言,比如“星星眨眼”,就是二进制信号。

因此四方语(4Case)体系,将二进制数字0、1作为“基础符号”,其它一切符号都由0、1定义。

二进制数字从右侧第1位向左,每个数位上的1,依次对应着十进制的1、2、4、8、16、32、64、128……

但因为0、1是基础符号,为避免循环定义,不应用其它符号描述,只能用实物或图像来表示二进制数字对应的具体数量。

麻将作为一款历史悠久的游戏,在中国乃至世界范围内广为流传。以麻将牌为实物,可在二进制与“具体数量”之间建立起牢固的“数字想象”。

“线段”对应着古人的“筹算”,所以用麻将“条牌”中“线段的数量”来定义二进制数字。

cb8e3eff61cdc6a22e7aff7727975448.png

儿童用纸质卡牌,防吞咽。手绘麻将卡时,“幺鸡”可画成“一条线段”。

表示0-1111的二进制数字,总共四张牌,分别是:“幺鸡”、“二条”、“四条”、“八条”。

另外还有一张“太阳花”,是两张“八条”之和,表示16条线段。

它们对应着二进制数字各数位上的“1”:幺鸡=1,二条=10,四条=100,八条=1000,太阳花=10000。

所有二进制数字皆是“幺鸡”的累加。所以二进制数字中的“1”读作“幺”,以区分于十进制。

8d39a6b63759e076b4421cf77c74087a.png

通过熟悉二进制数字与“线段数量”的对应关系,练习加法运算,便可对二进制数字产生直观认知。

比如提到二进制数字1011,大家脑海中应当出现“八条 + 二条 + 幺鸡”这三张牌的“图象”,而非名称。

将二进制数字0000 — 1111填入四格点阵,1出现在不同格子,表示不同的“线段数量”。

1cd2c94a0761a86b8aeea29845407af7.png

用“暗格”(读作“有”)表示1,“空格”(读作“无”)表示0,就构成了“二进制点阵”(简称“点阵”,英文Dot Array)。

四方语(4Case)的16个基本字根,正是二进制数字0000 — 1111“点阵化”之后的简写。

fcccceef3e7590ec31fb39ea27794ad3.png

可以通过对“点阵”的想象,记忆基本字根与二进制编号的对应关系:将字根想象为点阵,便得到对应的二进制数字;将二进制数字想象为点阵,便得到对应的字根。

所有四方字皆由基本字根排列组合而成,把字根对应的二进制数字依次连接,即为每个四方字的编号。

二进制运算极其简单,适合用设备来完成。输入计算机的所有数据,都要转化成二进制来储存。计算机内部的所有运算也是以二进制进行,只是在输出时转化成了十进制。

单靠手动,二进制数字则略显冗长,存在读写困难,点阵也不好画。所以二进制的人工四则运算,一般要通过竖式进行。

二进制加法口诀只有两句:“1 + 1 = 10”,“1 + 0 = 1”。(严格来说还有“0+0=0”,但考虑到十进制和十六进制加法口诀都没加上这句,所以省略了。)

二进制乘法口诀也只有两句:“1×1=1”,“1×0=0”。所以变成了“连加”。

9b955e0e7db488e7defa5f181f266835.png

二进制“减法口诀”有1-1=0、1-0=1、与0-1=1三句。

特别注意“0-1=1”,描述的是“向左侧借位之后”的计算结果,必须记住“借位后0变1”。

例如:100-1=11,1000-1=111,100000-1=11111。

直观上看,“借位1”右边有几个0,减完之后都变成1,而“借位1”自己变成0。

二进制除法不用“试商”(因为商不是0就是1),可直接简化为“连减”,所以采用“连减竖式”即可。

从左向右,遵循“不够减位商0”的运算口诀即可,依次向右做“连减”。

“除数向右移1位”还是“除数与被除数左侧对齐”,取决于首个“商1”的位置。

被除数“连减”到最后,不够减的整数,就是余数。余数补0后继续做“连减”,得到的商即是小数。

d9205557600f2c5d21e82fb63a9dff28.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个实现这些功能的C言程序。下面是代码及其注释: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义函数 void menu(); // 显示菜单 void binary_addition(); // 二进制加法 void binary_subtraction(); // 二进制减法 void binary_multiplication(); // 二进制乘法 void binary_division(); // 二进制除法 void error(); // 显示错误信息 // 主函数 int main() { menu(); // 显示菜单 return 0; } // 显示菜单 void menu() { int choice; printf("欢迎使用二进制计算器\n"); printf("1. 二进制加法\n"); printf("2. 二进制减法\n"); printf("3. 二进制乘法\n"); printf("4. 二进制除法\n"); printf("5. 退出\n"); printf("请选择:"); scanf("%d", &choice); switch (choice) { // 根据用户选择调用相应的函数 case 1: binary_addition(); break; case 2: binary_subtraction(); break; case 3: binary_multiplication(); break; case 4: binary_division(); break; case 5: printf("感谢使用二进制计算器\n"); exit(0); // 退出程序 default: error(); // 显示错误信息并重新显示菜单 menu(); } } // 二进制加法 void binary_addition() { char binary1[100], binary2[100], result[100]; int i, j, carry = 0; printf("请输入第一个二进制数:"); scanf("%s", binary1); printf("请输入第二个二进制数:"); scanf("%s", binary2); // 将两个二进制数对齐,并在左侧填充0 int len1 = strlen(binary1), len2 = strlen(binary2); int max_len = len1 > len2 ? len1 : len2; for (i = 0; i < max_len - len1; i++) { binary1[len1 + i] = '0'; } for (i = 0; i < max_len - len2; i++) { binary2[len2 + i] = '0'; } // 从右往左逐位相加 for (i = max_len - 1; i >= 0; i--) { int sum = (binary1[i] - '0') + (binary2[i] - '0') + carry; if (sum == 0) { result[i] = '0'; carry = 0; } else if (sum == 1) { result[i] = '1'; carry = 0; } else if (sum == 2) { result[i] = '0'; carry = 1; } else if (sum == 3) { result[i] = '1'; carry = 1; } } // 如果最高位有进位,则需要在左侧添加一位1 if (carry == 1) { printf("结果为:1%s\n", result); } else { printf("结果为:%s\n", result); } // 继续该运算或返回菜单 char continue_choice; printf("是否继续该运算?(Y/N)"); scanf(" %c", &continue_choice); if (continue_choice == 'Y' || continue_choice == 'y') { binary_addition(); } else { menu(); } } // 二进制减法 void binary_subtraction() { char binary1[100], binary2[100], result[100]; int i, j, borrow = 0; printf("请输入第一个二进制数:"); scanf("%s", binary1); printf("请输入第二个二进制数:"); scanf("%s", binary2); // 将两个二进制数对齐,并在左侧填充0 int len1 = strlen(binary1), len2 = strlen(binary2); int max_len = len1 > len2 ? len1 : len2; for (i = 0; i < max_len - len1; i++) { binary1[len1 + i] = '0'; } for (i = 0; i < max_len - len2; i++) { binary2[len2 + i] = '0'; } // 从右往左逐位相减 for (i = max_len - 1; i >= 0; i--) { int diff = (binary1[i] - '0') - (binary2[i] - '0') - borrow; if (diff == 0) { result[i] = '0'; borrow = 0; } else if (diff == 1) { result[i] = '1'; borrow = 0; } else if (diff == -1) { result[i] = '1'; borrow = 1; } } // 如果最高位有借位,则说明第二个数大于第一个数,需要给出错误提示 if (borrow == 1) { error(); menu(); } else { printf("结果为:%s\n", result); } // 继续该运算或返回菜单 char continue_choice; printf("是否继续该运算?(Y/N)"); scanf(" %c", &continue_choice); if (continue_choice == 'Y' || continue_choice == 'y') { binary_subtraction(); } else { menu(); } } // 二进制乘法 void binary_multiplication() { char binary1[100], binary2[100], result[200]; int i, j, carry = 0; printf("请输入第一个二进制数:"); scanf("%s", binary1); printf("请输入第二个二进制数:"); scanf("%s", binary2); // 将两个二进制数对齐,并在左侧填充0 int len1 = strlen(binary1), len2 = strlen(binary2); int max_len = len1 > len2 ? len1 : len2; for (i = 0; i < max_len - len1; i++) { binary1[len1 + i] = '0'; } for (i = 0; i < max_len - len2; i++) { binary2[len2 + i] = '0'; } // 将结果数组初始化为0 for (i = 0; i < max_len * 2; i++) { result[i] = '0'; } // 从右往左逐位相乘,将乘积相加到结果数组中 for (i = max_len - 1; i >= 0; i--) { for (j = max_len - 1; j >= 0; j--) { int product = (binary1[i] - '0') * (binary2[j] - '0') + (result[i + j + 1] - '0') + carry; result[i + j + 1] = product % 2 + '0'; carry = product / 2; } result[i] += carry; carry = 0; } // 如果最高位有进位,则需要在左侧添加一位1 if (result[0] == '0') { printf("结果为:%s\n", result + 1); } else { printf("结果为:%s\n", result); } // 继续该运算或返回菜单 char continue_choice; printf("是否继续该运算?(Y/N)"); scanf(" %c", &continue_choice); if (continue_choice == 'Y' || continue_choice == 'y') { binary_multiplication(); } else { menu(); } } // 二进制除法 void binary_division() { char binary1[100], binary2[100], quotient[100], remainder[100]; int i, j; printf("请输入被除数:"); scanf("%s", binary1); printf("请输入除数:"); scanf("%s", binary2); // 将被除数和除数转换为十进制数 int dividend = 0, divisor = 0; for (i = 0; i < strlen(binary1); i++) { dividend = dividend * 2 + (binary1[i] - '0'); } for (i = 0; i < strlen(binary2); i++) { divisor = divisor * 2 + (binary2[i] - '0'); } // 对除数为0的情况进行错误处理 if (divisor == 0) { error(); menu(); return; } // 将商和余数初始化为0 for (i = 0; i < strlen(binary1); i++) { quotient[i] = '0'; } quotient[i] = '\0'; remainder[0] = '0'; remainder[1] = '\0'; // 从左往右逐位进行除法运算 for (i = 0; i < strlen(binary1); i++) { remainder[i] = binary1[i]; int temp = 0; for (j = 0; j < 2; j++) { temp = temp * 2 + (remainder[j] - '0'); } int q = temp / divisor; quotient[i] = q + '0'; int r = temp % divisor; remainder[0] = r + '0'; } printf("商为:%s\n", quotient); printf("余数为:%s\n", remainder); // 继续该运算或返回菜单 char continue_choice; printf("是否继续该运算?(Y/N)"); scanf(" %c", &continue_choice); if (continue_choice == 'Y' || continue_choice == 'y') { binary_division(); } else { menu(); } } // 显示错误信息 void error() { printf("输入有误,请重新输入!\n"); } // 测试案例 /* 1. 二进制加法 请输入第一个二进制数:1011 请输入第二个二进制数:110 结果为:10001 是否继续该运算?(Y/N)Y 请输入第一个二进制数:110111 请输入第二个二进制数:101010 结果为:1100101 是否继续该运算?(Y/N)N 2. 二进制减法 请输入第一个二进制数:110111 请输入第二个二进制数:101010 结果为:1101 是否继续该运算?(Y/N)Y 请输入第一个二进制数:1010 请输入第二个二进制数:1101 输入有误,请重新输入! 欢迎使用二进制计算器 1. 二进制加法 2. 二进制减法 3. 二进制乘法 4. 二进制除法 5. 退出 请选择:2 请输入第一个二进制数:1010 请输入第二个二进制数:1101 结果为:输入有误,请重新输入! 3. 二进制乘法 请输入第一个二进制数:101 请输入第二个二进制数:110 结果为:11110 是否继续该运算?(Y/N)Y 请输入第一个二进制数:1101 请输入第二个二进制数:1010 结果为:11101110 是否继续该运算?(Y/N)N 4. 二进制除法 请输入被除数:101011 请输入除数:11 商为:10010 余数为:1 是否继续该运算?(Y/N)Y 请输入被除数:110011 请输入除数:101 商为:110 余数为:11 是否继续该运算?(Y/N)N */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值