鱼C论坛

 找回密码
 立即注册
查看: 2560|回复: 10

[已解决]我不知道你们怎么算这个位运算的

[复制链接]
发表于 2020-10-25 23:25:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是一个转化字母大小写的小程序
Ch=getchar();
If(ch&32)
{
Ch=ch&223;//使第五位为0,变大写;
}
Else
{
Ch=ch|255;//使第五位为零变小写;
}
Putchar(ch)
















这是一个转化字母大小写的小程序
Ch=get char();
If(ch&32)
{
Ch=ch&223;//使第五位为0,变大写;
}
Else
{
Ch=ch|255;//使第五位为零变小写;
}
Put char(ch)1
//   32二进制  0010 0000                    223二进制为1101 1111;                             255二进制为1111 1111;          0  1  0  0   0   0  0   1
这是我目前为止看过小甲鱼视频怀疑人生的一次。比如我输入ch的值为A,65转化为二进制也就是0100 0001,       &   0  0  1  0   0   0  0   0
就是先判断&语句,A&32------------------------------------------------------------------------------------------------------------------------------------------------>所以结果为0;那么就是执行else语句;

                                                                                                                                                                       0  0  0   0  0   0  0   0       

                                                                                                                                                                   0  1  0  0  0  0  0 1       
                                                                                                                                                              |    1  1  1  1  1  1  1 1       
ch|255------------------——————————————————————————————————————————————————————————>那么结果就是等于 1111 1111 ,转化一下还是255,我不知道到底怎么算他才等于97转化二进制为0110 0001;       
有哪位大哥可以说一下位运算到底是什么东西怎么算的,和数学都完全不一样;               
                                                                                                                                                                   1  1  1  1   1  1  1  1





















最佳答案
2020-10-26 13:50:34
本帖最后由 风过无痕1989 于 2020-10-26 14:24 编辑
星空爱鱼C 发表于 2020-10-26 12:35
还有可以说下  A|32  下面数值参与运算为什么是0010 0000  而A&32  参与运算的数值竟然变成了  1101 1111


现在的图才是对的,原来的图下边写着是 a | 32 和 a & 223,参与运算的代码却是大写字母 A 的

现在就来说按位或和按位与:

先搞清楚怎么表示按位或和按位与,我们已经知道,或的运算符是双竖杠 ||,与的运算符两个嗯n得 &&,按位或和按位与的运算符就是它们的一半,只有一个

0  1  0  0   0  0  0  1    <------ 大写字母A的二进制码
0  0  1  0   0  0  0  0    <------ 十进制数32的二进制码
---------------------------------------------------------------------
0  1  1  0   0  0  0  1    <------ 上下对应位按全0出0,有1出1的原则进行按位或,结果就是小写字母 a 的二进制码


0  1  1  0   0  0  0  1    <------ 小写字母 a 的二进制码
1  1  0  1   1  1  1  1    <------ 十进制数 223 的二进制码
---------------------------------------------------------------------
0  1  0  0   0  0  0  1    <------ 上下对应位按有0出0,全1出1的原则进行按位与,结果就是大写字母 A 的二进制码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-25 23:27:04 | 显示全部楼层
看了那么久的视频第一次特别头晕,脑子一盘空白;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-26 03:44:08 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-10-26 14:00 编辑

根据字母的二进制ASCII码值 ( 如下图------大小写二进制码 ),可以看出,第7位全为1(从右往左数),而字母的区别在于0-7位;仔细观察发现,大写的第六位全是0,而小写的第六位全是1;神奇的是, 同一字母的大写和小写除了第六位不同,其它位都相同。 所以要想改变大小写,需要对第六位的二进制做处理 ( 按位或、按位与操作 ),所以借助 ( 第六位为1的数字是32:0010 0000 ) 位运算符便可实现大小写转换 (如下图------运算原理)。

大小写字母二进制码.jpg
运算原理.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-26 11:36:57 | 显示全部楼层
从右至左第6位,而不是第5位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-26 12:23:39 From FishC Mobile | 显示全部楼层
小甲鱼的视频if之后(判断完后执行的语句你看看上面代码)的语句是(Aa) 与223.或者是   或255,没有你说的(Aa)与或32
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-26 12:35:25 From FishC Mobile | 显示全部楼层
还有可以说下  A|32  下面数值参与运算为什么是0010 0000  而A&32  参与运算的数值竟然变成了  1101 1111
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-26 13:46:54 | 显示全部楼层
星空爱鱼C 发表于 2020-10-26 12:35
还有可以说下  A|32  下面数值参与运算为什么是0010 0000  而A&32  参与运算的数值竟然变成了  1101 1111

看上面的图呀。我怀疑你那个程序错误,小写字母按位与(输入的字母跟 11011111,即十进制的223)才能变成大写字母,大写字母按位与位或(输入的字母跟 00100000,即十进制的32)才能变成小写字母,你的程序中正好相反

PS:昨天上传的图是 -33 看着不舒服,刚才我改过来了,改成 223,十进制 223 的二进制码和 -33 的二进制码是一样的,都是 1101 1111
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-26 13:50:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风过无痕1989 于 2020-10-26 14:24 编辑
星空爱鱼C 发表于 2020-10-26 12:35
还有可以说下  A|32  下面数值参与运算为什么是0010 0000  而A&32  参与运算的数值竟然变成了  1101 1111


现在的图才是对的,原来的图下边写着是 a | 32 和 a & 223,参与运算的代码却是大写字母 A 的

现在就来说按位或和按位与:

先搞清楚怎么表示按位或和按位与,我们已经知道,或的运算符是双竖杠 ||,与的运算符两个嗯n得 &&,按位或和按位与的运算符就是它们的一半,只有一个

0  1  0  0   0  0  0  1    <------ 大写字母A的二进制码
0  0  1  0   0  0  0  0    <------ 十进制数32的二进制码
---------------------------------------------------------------------
0  1  1  0   0  0  0  1    <------ 上下对应位按全0出0,有1出1的原则进行按位或,结果就是小写字母 a 的二进制码


0  1  1  0   0  0  0  1    <------ 小写字母 a 的二进制码
1  1  0  1   1  1  1  1    <------ 十进制数 223 的二进制码
---------------------------------------------------------------------
0  1  0  0   0  0  0  1    <------ 上下对应位按有0出0,全1出1的原则进行按位与,结果就是大写字母 A 的二进制码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-26 15:48:33 | 显示全部楼层
以下是完整的程序代码
#include <stdio.h>

void main()

{
    char ch, temp;
    printf("请输入一个字母: \n");

    ch = getchar();;
    temp = getchar();   // 接收回车键
    while( !(ch > 'A' || (ch < 'Z' && ch > 'a') || ch < 'z'))
    {
        printf("输入有误, 请重新输入一个字母: \n");
        ch = getchar();
    }
    if( ch & 32 )
    {
        ch = ch & 223; // 223 二进制码:11011111-->使第六位为0,小写变大写
    }
    else
    {
        ch = ch | 32;  // 32  二进制码:00100000-->使第六位为1,变小写
    }
        putchar(ch);

    printf("\n");

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-28 20:02:03 | 显示全部楼层
我也不知道你们说的对不对,不过视频是视频10年前的视频用的是v c++6.0,,我刚刚在我电脑运行了一下,发现我自己的电脑我输入一个S,他给我输出一个'  , ',没错就是逗号,可能是有点问题这个视频,是不是改版了之后就更新一下算法了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-28 23:09:52 | 显示全部楼层
星空爱鱼C 发表于 2020-10-28 20:02
我也不知道你们说的对不对,不过视频是视频10年前的视频用的是v c++6.0,,我刚刚在我电脑运行了一下,发现 ...

说实话,你题目中的那个 255 ,我还没搞懂是怎么回事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-10 20:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表