我不知道你们怎么算这个位运算的
这是一个转化字母大小写的小程序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; 0100 0 00 1
这是我目前为止看过小甲鱼视频怀疑人生的一次。比如我输入ch的值为A,65转化为二进制也就是0100 0001, & 0010 0 00 0
就是先判断&语句,A&32------------------------------------------------------------------------------------------------------------------------------------------------>所以结果为0;那么就是执行else语句;
000 00 00 0
0100000 1
| 1111111 1
ch|255------------------——————————————————————————————————————————————————————————>那么结果就是等于 1111 1111 ,转化一下还是255,我不知道到底怎么算他才等于97转化二进制为0110 0001;
有哪位大哥可以说一下位运算到底是什么东西怎么算的,和数学都完全不一样;
1111 1111
看了那么久的视频第一次特别头晕,脑子一盘空白;
本帖最后由 风过无痕1989 于 2020-10-26 14:00 编辑
根据字母的二进制ASCII码值 ( 如下图------大小写二进制码 ),可以看出,第7位全为1(从右往左数),而字母的区别在于0-7位;仔细观察发现,大写的第六位全是0,而小写的第六位全是1;神奇的是, 同一字母的大写和小写除了第六位不同,其它位都相同。 所以要想改变大小写,需要对第六位的二进制做处理 ( 按位或、按位与操作 ),所以借助 ( 第六位为1的数字是32:0010 0000 ) 位运算符便可实现大小写转换 (如下图------运算原理)。
从右至左第6位,而不是第5位 小甲鱼的视频if之后(判断完后执行的语句你看看上面代码)的语句是(Aa) 与223.或者是 或255,没有你说的(Aa)与或32 还有可以说下A|32下面数值参与运算为什么是0010 0000而A&32参与运算的数值竟然变成了1101 1111 星空爱鱼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 本帖最后由 风过无痕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得 &&,按位或和按位与的运算符就是它们的一半,只有一个
0100 0001 <------ 大写字母A的二进制码
0010 0000 <------ 十进制数32的二进制码
---------------------------------------------------------------------
0110 0001 <------ 上下对应位按全0出0,有1出1的原则进行按位或,结果就是小写字母 a 的二进制码
0110 0001 <------ 小写字母 a 的二进制码
1101 1111 <------ 十进制数 223 的二进制码
---------------------------------------------------------------------
0100 0001 <------ 上下对应位按有0出0,全1出1的原则进行按位与,结果就是大写字母 A 的二进制码
以下是完整的程序代码
#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");
}
我也不知道你们说的对不对,不过视频是视频10年前的视频用的是v c++6.0,,我刚刚在我电脑运行了一下,发现我自己的电脑我输入一个S,他给我输出一个', ',没错就是逗号,可能是有点问题这个视频,是不是改版了之后就更新一下算法了
星空爱鱼C 发表于 2020-10-28 20:02
我也不知道你们说的对不对,不过视频是视频10年前的视频用的是v c++6.0,,我刚刚在我电脑运行了一下,发现 ...
说实话,你题目中的那个 255 ,我还没搞懂是怎么回事
页:
[1]